Mercurial > cpython-lru_cache-weakref
annotate Modules/_struct.c @ 58973:db86bf39ccaa legacy-trunk
Issue 7970: When email.Parser.Parser parses a MIME message of type
message/rfc822 it turns it into an object whose body consists of
a list containing a single Message object. HeaderParser, on the
other hand, just copies the body as a string. Generator.flatten
has a special handler for the message mime type that expected the
body to be the one item list. This fails if the message was parsed
by HeaderParser. So we now check to see if the body is a string
first, and if so just we just emit it.
| author | R. David Murray <rdmurray@bitdance.com> |
|---|---|
| date | Sun, 21 Feb 2010 04:23:00 +0000 |
| parents | e759ca25701d |
| children | c2d9d50f37c5 |
| rev | line source |
|---|---|
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1 /* struct module -- pack values into and (out of) strings */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
2 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
3 /* New version supporting byte order, alignment and size options, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
4 character strings, and unsigned numbers */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
5 |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
6 #define PY_SSIZE_T_CLEAN |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
7 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
8 #include "Python.h" |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
9 #include "structseq.h" |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
10 #include "structmember.h" |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
11 #include <ctype.h> |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
12 |
|
38266
74c82ebc4e44
forward declaration for PyStructType
Bob Ippolito <bob@redivi.com>
parents:
38264
diff
changeset
|
13 static PyTypeObject PyStructType; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
14 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
15 /* compatibility macros */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
16 #if (PY_VERSION_HEX < 0x02050000) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
17 typedef int Py_ssize_t; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
18 #endif |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
19 |
|
39380
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
20 /* If PY_STRUCT_FLOAT_COERCE is defined, the struct module will allow float |
|
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
21 arguments for integer formats with a warning for backwards |
|
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
22 compatibility. */ |
|
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
23 |
|
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
24 #define PY_STRUCT_FLOAT_COERCE 1 |
|
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
25 |
|
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
26 #ifdef PY_STRUCT_FLOAT_COERCE |
|
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
27 #define FLOAT_COERCE "integer argument expected, got float" |
|
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
28 #endif |
|
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
29 |
|
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
30 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
31 /* The translation function for each format character is table driven */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
32 typedef struct _formatdef { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
33 char format; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
34 Py_ssize_t size; |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
35 Py_ssize_t alignment; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
36 PyObject* (*unpack)(const char *, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
37 const struct _formatdef *); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
38 int (*pack)(char *, PyObject *, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
39 const struct _formatdef *); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
40 } formatdef; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
41 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
42 typedef struct _formatcode { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
43 const struct _formatdef *fmtdef; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
44 Py_ssize_t offset; |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
45 Py_ssize_t size; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
46 } formatcode; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
47 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
48 /* Struct object interface */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
49 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
50 typedef struct { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
51 PyObject_HEAD |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
52 Py_ssize_t s_size; |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
53 Py_ssize_t s_len; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
54 formatcode *s_codes; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
55 PyObject *s_format; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
56 PyObject *weakreflist; /* List of weak references */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
57 } PyStructObject; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
58 |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
59 |
| 38267 | 60 #define PyStruct_Check(op) PyObject_TypeCheck(op, &PyStructType) |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
42333
diff
changeset
|
61 #define PyStruct_CheckExact(op) (Py_TYPE(op) == &PyStructType) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
62 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
63 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
64 /* Exception */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
65 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
66 static PyObject *StructError; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
67 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
68 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
69 /* Define various structs to figure out the alignments of types */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
70 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
71 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
72 typedef struct { char c; short x; } st_short; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
73 typedef struct { char c; int x; } st_int; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
74 typedef struct { char c; long x; } st_long; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
75 typedef struct { char c; float x; } st_float; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
76 typedef struct { char c; double x; } st_double; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
77 typedef struct { char c; void *x; } st_void_p; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
78 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
79 #define SHORT_ALIGN (sizeof(st_short) - sizeof(short)) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
80 #define INT_ALIGN (sizeof(st_int) - sizeof(int)) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
81 #define LONG_ALIGN (sizeof(st_long) - sizeof(long)) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
82 #define FLOAT_ALIGN (sizeof(st_float) - sizeof(float)) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
83 #define DOUBLE_ALIGN (sizeof(st_double) - sizeof(double)) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
84 #define VOID_P_ALIGN (sizeof(st_void_p) - sizeof(void *)) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
85 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
86 /* We can't support q and Q in native mode unless the compiler does; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
87 in std mode, they're 8 bytes on all platforms. */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
88 #ifdef HAVE_LONG_LONG |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
89 typedef struct { char c; PY_LONG_LONG x; } s_long_long; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
90 #define LONG_LONG_ALIGN (sizeof(s_long_long) - sizeof(PY_LONG_LONG)) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
91 #endif |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
92 |
|
40681
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
93 #ifdef HAVE_C99_BOOL |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
94 #define BOOL_TYPE _Bool |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
95 typedef struct { char c; _Bool x; } s_bool; |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
96 #define BOOL_ALIGN (sizeof(s_bool) - sizeof(BOOL_TYPE)) |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
97 #else |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
98 #define BOOL_TYPE char |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
99 #define BOOL_ALIGN 0 |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
100 #endif |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
101 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
102 #define STRINGIFY(x) #x |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
103 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
104 #ifdef __powerc |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
105 #pragma options align=reset |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
106 #endif |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
107 |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
108 static char *integer_codes = "bBhHiIlLqQ"; |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
109 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
110 /* Helper to get a PyLongObject by hook or by crook. Caller should decref. */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
111 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
112 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
113 get_pylong(PyObject *v) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
114 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
115 assert(v != NULL); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
116 if (PyInt_Check(v)) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
117 return PyLong_FromLong(PyInt_AS_LONG(v)); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
118 if (PyLong_Check(v)) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
119 Py_INCREF(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
120 return v; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
121 } |
|
55121
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
122 #ifdef PY_STRUCT_FLOAT_COERCE |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
123 if (PyFloat_Check(v)) { |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
124 if (PyErr_WarnEx(PyExc_DeprecationWarning, FLOAT_COERCE, 2)<0) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
125 return NULL; |
|
55121
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
126 return PyNumber_Long(v); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
127 } |
|
55121
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
128 #endif |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
129 PyErr_SetString(StructError, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
130 "cannot convert argument to long"); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
131 return NULL; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
132 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
133 |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
134 /* Helper to convert a Python object to a C long. Sets an exception |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
135 (struct.error for an inconvertible type, OverflowError for |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
136 out-of-range values) and returns -1 on error. */ |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
137 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
138 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
139 get_long(PyObject *v, long *p) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
140 { |
|
55121
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
141 long x; |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
142 |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
143 v = get_pylong(v); |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
144 if (v == NULL) |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
145 return -1; |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
146 assert(PyLong_Check(v)); |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
147 x = PyLong_AsLong(v); |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
148 Py_DECREF(v); |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
149 if (x == (long)-1 && PyErr_Occurred()) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
150 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
151 *p = x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
152 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
153 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
154 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
155 /* Same, but handling unsigned long */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
156 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
157 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
158 get_ulong(PyObject *v, unsigned long *p) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
159 { |
|
55121
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
160 unsigned long x; |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
161 |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
162 v = get_pylong(v); |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
163 if (v == NULL) |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
164 return -1; |
|
55121
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
165 assert(PyLong_Check(v)); |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
166 x = PyLong_AsUnsignedLong(v); |
|
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
167 Py_DECREF(v); |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
168 if (x == (unsigned long)-1 && PyErr_Occurred()) |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
169 return -1; |
|
55121
1fc37fecaf8f
Issues #1530559, #1741130: Fix various inconsistencies in struct.pack
Mark Dickinson <dickinsm@gmail.com>
parents:
54412
diff
changeset
|
170 *p = x; |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
171 return 0; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
172 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
173 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
174 #ifdef HAVE_LONG_LONG |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
175 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
176 /* Same, but handling native long long. */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
177 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
178 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
179 get_longlong(PyObject *v, PY_LONG_LONG *p) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
180 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
181 PY_LONG_LONG x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
182 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
183 v = get_pylong(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
184 if (v == NULL) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
185 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
186 assert(PyLong_Check(v)); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
187 x = PyLong_AsLongLong(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
188 Py_DECREF(v); |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
189 if (x == (PY_LONG_LONG)-1 && PyErr_Occurred()) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
190 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
191 *p = x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
192 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
193 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
194 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
195 /* Same, but handling native unsigned long long. */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
196 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
197 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
198 get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
199 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
200 unsigned PY_LONG_LONG x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
201 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
202 v = get_pylong(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
203 if (v == NULL) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
204 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
205 assert(PyLong_Check(v)); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
206 x = PyLong_AsUnsignedLongLong(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
207 Py_DECREF(v); |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
208 if (x == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred()) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
209 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
210 *p = x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
211 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
212 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
213 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
214 #endif |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
215 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
216 /* Floating point helpers */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
217 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
218 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
219 unpack_float(const char *p, /* start of 4-byte string */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
220 int le) /* true for little-endian, false for big-endian */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
221 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
222 double x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
223 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
224 x = _PyFloat_Unpack4((unsigned char *)p, le); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
225 if (x == -1.0 && PyErr_Occurred()) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
226 return NULL; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
227 return PyFloat_FromDouble(x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
228 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
229 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
230 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
231 unpack_double(const char *p, /* start of 8-byte string */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
232 int le) /* true for little-endian, false for big-endian */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
233 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
234 double x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
235 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
236 x = _PyFloat_Unpack8((unsigned char *)p, le); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
237 if (x == -1.0 && PyErr_Occurred()) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
238 return NULL; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
239 return PyFloat_FromDouble(x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
240 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
241 |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
242 /* Helper to format the range error exceptions */ |
|
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
243 static int |
| 38484 | 244 _range_error(const formatdef *f, int is_unsigned) |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
245 { |
|
38529
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
246 /* ulargest is the largest unsigned value with f->size bytes. |
|
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
247 * Note that the simpler: |
|
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
248 * ((size_t)1 << (f->size * 8)) - 1 |
|
38530
447a94b039de
Repaired error in new comment.
Tim Peters <tim.peters@gmail.com>
parents:
38529
diff
changeset
|
249 * doesn't work when f->size == sizeof(size_t) because C doesn't |
|
447a94b039de
Repaired error in new comment.
Tim Peters <tim.peters@gmail.com>
parents:
38529
diff
changeset
|
250 * define what happens when a left shift count is >= the number of |
|
447a94b039de
Repaired error in new comment.
Tim Peters <tim.peters@gmail.com>
parents:
38529
diff
changeset
|
251 * bits in the integer being shifted; e.g., on some boxes it doesn't |
|
447a94b039de
Repaired error in new comment.
Tim Peters <tim.peters@gmail.com>
parents:
38529
diff
changeset
|
252 * shift at all when they're equal. |
|
38529
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
253 */ |
|
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
254 const size_t ulargest = (size_t)-1 >> ((SIZEOF_SIZE_T - f->size)*8); |
|
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
255 assert(f->size >= 1 && f->size <= SIZEOF_SIZE_T); |
|
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
256 if (is_unsigned) |
|
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
257 PyErr_Format(StructError, |
|
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
258 "'%c' format requires 0 <= number <= %zu", |
|
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
259 f->format, |
|
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
260 ulargest); |
|
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
261 else { |
|
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
262 const Py_ssize_t largest = (Py_ssize_t)(ulargest >> 1); |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
263 PyErr_Format(StructError, |
|
38520
1a56da86c11a
Calculate smallest properly (it was off by one) and use proper ssize_t types for Win64
Neal Norwitz <nnorwitz@gmail.com>
parents:
38515
diff
changeset
|
264 "'%c' format requires %zd <= number <= %zd", |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
265 f->format, |
|
38529
a7f2295a78ac
_range_error(): Speed and simplify (there's no real need for
Tim Peters <tim.peters@gmail.com>
parents:
38528
diff
changeset
|
266 ~ largest, |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
267 largest); |
|
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
268 } |
|
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
269 return -1; |
|
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
270 } |
|
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
271 |
|
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
272 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
273 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
274 /* A large number of small routines follow, with names of the form |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
275 |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
276 [bln][up]_TYPE |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
277 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
278 [bln] distiguishes among big-endian, little-endian and native. |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
279 [pu] distiguishes between pack (to struct) and unpack (from struct). |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
280 TYPE is one of char, byte, ubyte, etc. |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
281 */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
282 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
283 /* Native mode routines. ****************************************************/ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
284 /* NOTE: |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
285 In all n[up]_<type> routines handling types larger than 1 byte, there is |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
286 *no* guarantee that the p pointer is properly aligned for each type, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
287 therefore memcpy is called. An intermediate variable is used to |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
288 compensate for big-endian architectures. |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
289 Normally both the intermediate variable and the memcpy call will be |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
290 skipped by C optimisation in little-endian architectures (gcc >= 2.91 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
291 does this). */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
292 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
293 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
294 nu_char(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
295 { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
296 return PyString_FromStringAndSize(p, 1); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
297 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
298 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
299 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
300 nu_byte(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
301 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
302 return PyInt_FromLong((long) *(signed char *)p); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
303 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
304 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
305 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
306 nu_ubyte(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
307 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
308 return PyInt_FromLong((long) *(unsigned char *)p); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
309 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
310 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
311 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
312 nu_short(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
313 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
314 short x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
315 memcpy((char *)&x, p, sizeof x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
316 return PyInt_FromLong((long)x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
317 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
318 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
319 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
320 nu_ushort(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
321 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
322 unsigned short x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
323 memcpy((char *)&x, p, sizeof x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
324 return PyInt_FromLong((long)x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
325 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
326 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
327 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
328 nu_int(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
329 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
330 int x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
331 memcpy((char *)&x, p, sizeof x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
332 return PyInt_FromLong((long)x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
333 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
334 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
335 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
336 nu_uint(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
337 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
338 unsigned int x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
339 memcpy((char *)&x, p, sizeof x); |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
340 #if (SIZEOF_LONG > SIZEOF_INT) |
|
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
341 return PyInt_FromLong((long)x); |
|
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
342 #else |
|
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
343 if (x <= ((unsigned int)LONG_MAX)) |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
344 return PyInt_FromLong((long)x); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
345 return PyLong_FromUnsignedLong((unsigned long)x); |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
346 #endif |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
347 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
348 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
349 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
350 nu_long(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
351 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
352 long x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
353 memcpy((char *)&x, p, sizeof x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
354 return PyInt_FromLong(x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
355 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
356 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
357 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
358 nu_ulong(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
359 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
360 unsigned long x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
361 memcpy((char *)&x, p, sizeof x); |
|
38316
2f16e2715223
Use LONG_MIN and LONG_MAX to check Python integer bounds instead of the incorrect INT_MIN and INT_MAX
Bob Ippolito <bob@redivi.com>
parents:
38313
diff
changeset
|
362 if (x <= LONG_MAX) |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
363 return PyInt_FromLong((long)x); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
364 return PyLong_FromUnsignedLong(x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
365 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
366 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
367 /* Native mode doesn't support q or Q unless the platform C supports |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
368 long long (or, on Windows, __int64). */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
369 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
370 #ifdef HAVE_LONG_LONG |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
371 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
372 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
373 nu_longlong(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
374 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
375 PY_LONG_LONG x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
376 memcpy((char *)&x, p, sizeof x); |
|
38316
2f16e2715223
Use LONG_MIN and LONG_MAX to check Python integer bounds instead of the incorrect INT_MIN and INT_MAX
Bob Ippolito <bob@redivi.com>
parents:
38313
diff
changeset
|
377 if (x >= LONG_MIN && x <= LONG_MAX) |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
378 return PyInt_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long)); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
379 return PyLong_FromLongLong(x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
380 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
381 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
382 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
383 nu_ulonglong(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
384 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
385 unsigned PY_LONG_LONG x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
386 memcpy((char *)&x, p, sizeof x); |
|
38316
2f16e2715223
Use LONG_MIN and LONG_MAX to check Python integer bounds instead of the incorrect INT_MIN and INT_MAX
Bob Ippolito <bob@redivi.com>
parents:
38313
diff
changeset
|
387 if (x <= LONG_MAX) |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
388 return PyInt_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long)); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
389 return PyLong_FromUnsignedLongLong(x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
390 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
391 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
392 #endif |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
393 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
394 static PyObject * |
|
40681
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
395 nu_bool(const char *p, const formatdef *f) |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
396 { |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
397 BOOL_TYPE x; |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
398 memcpy((char *)&x, p, sizeof x); |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
399 return PyBool_FromLong(x != 0); |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
400 } |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
401 |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
402 |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
403 static PyObject * |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
404 nu_float(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
405 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
406 float x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
407 memcpy((char *)&x, p, sizeof x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
408 return PyFloat_FromDouble((double)x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
409 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
410 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
411 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
412 nu_double(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
413 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
414 double x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
415 memcpy((char *)&x, p, sizeof x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
416 return PyFloat_FromDouble(x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
417 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
418 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
419 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
420 nu_void_p(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
421 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
422 void *x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
423 memcpy((char *)&x, p, sizeof x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
424 return PyLong_FromVoidPtr(x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
425 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
426 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
427 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
428 np_byte(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
429 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
430 long x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
431 if (get_long(v, &x) < 0) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
432 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
433 if (x < -128 || x > 127){ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
434 PyErr_SetString(StructError, |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
435 "byte format requires -128 <= number <= 127"); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
436 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
437 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
438 *p = (char)x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
439 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
440 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
441 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
442 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
443 np_ubyte(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
444 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
445 long x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
446 if (get_long(v, &x) < 0) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
447 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
448 if (x < 0 || x > 255){ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
449 PyErr_SetString(StructError, |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
450 "ubyte format requires 0 <= number <= 255"); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
451 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
452 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
453 *p = (char)x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
454 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
455 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
456 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
457 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
458 np_char(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
459 { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
460 if (!PyString_Check(v) || PyString_Size(v) != 1) { |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
461 PyErr_SetString(StructError, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
462 "char format require string of length 1"); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
463 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
464 } |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
465 *p = *PyString_AsString(v); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
466 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
467 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
468 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
469 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
470 np_short(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
471 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
472 long x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
473 short y; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
474 if (get_long(v, &x) < 0) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
475 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
476 if (x < SHRT_MIN || x > SHRT_MAX){ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
477 PyErr_SetString(StructError, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
478 "short format requires " STRINGIFY(SHRT_MIN) |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
479 " <= number <= " STRINGIFY(SHRT_MAX)); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
480 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
481 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
482 y = (short)x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
483 memcpy(p, (char *)&y, sizeof y); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
484 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
485 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
486 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
487 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
488 np_ushort(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
489 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
490 long x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
491 unsigned short y; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
492 if (get_long(v, &x) < 0) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
493 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
494 if (x < 0 || x > USHRT_MAX){ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
495 PyErr_SetString(StructError, |
|
55142
880b50bca1b1
Typo in error message
Mark Dickinson <dickinsm@gmail.com>
parents:
55121
diff
changeset
|
496 "ushort format requires 0 <= number <= " STRINGIFY(USHRT_MAX)); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
497 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
498 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
499 y = (unsigned short)x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
500 memcpy(p, (char *)&y, sizeof y); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
501 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
502 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
503 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
504 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
505 np_int(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
506 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
507 long x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
508 int y; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
509 if (get_long(v, &x) < 0) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
510 return -1; |
|
38429
003433511e4d
Remove the range checking and int usage #defines from _struct and strip out the now-dead code
Bob Ippolito <bob@redivi.com>
parents:
38411
diff
changeset
|
511 #if (SIZEOF_LONG > SIZEOF_INT) |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
512 if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX))) |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
513 return _range_error(f, 0); |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
514 #endif |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
515 y = (int)x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
516 memcpy(p, (char *)&y, sizeof y); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
517 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
518 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
519 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
520 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
521 np_uint(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
522 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
523 unsigned long x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
524 unsigned int y; |
|
56246
3dec3b77b787
Eliminate unnecessary get_wrapped_(u)long defines in struct module.
Mark Dickinson <dickinsm@gmail.com>
parents:
55153
diff
changeset
|
525 if (get_ulong(v, &x) < 0) |
|
50424
df3923c36ec5
Merged revisions 67952-67953,67955,67957-67958,67960-67961,67963,67965,67967,67970-67971,67973,67982,67988,67990,67995,68014,68016,68030,68057,68061,68112,68115-68118,68120-68121,68123-68128 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49351
diff
changeset
|
526 return -1; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
527 y = (unsigned int)x; |
|
38429
003433511e4d
Remove the range checking and int usage #defines from _struct and strip out the now-dead code
Bob Ippolito <bob@redivi.com>
parents:
38411
diff
changeset
|
528 #if (SIZEOF_LONG > SIZEOF_INT) |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
529 if (x > ((unsigned long)UINT_MAX)) |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
530 return _range_error(f, 1); |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
531 #endif |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
532 memcpy(p, (char *)&y, sizeof y); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
533 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
534 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
535 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
536 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
537 np_long(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
538 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
539 long x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
540 if (get_long(v, &x) < 0) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
541 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
542 memcpy(p, (char *)&x, sizeof x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
543 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
544 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
545 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
546 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
547 np_ulong(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
548 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
549 unsigned long x; |
|
56246
3dec3b77b787
Eliminate unnecessary get_wrapped_(u)long defines in struct module.
Mark Dickinson <dickinsm@gmail.com>
parents:
55153
diff
changeset
|
550 if (get_ulong(v, &x) < 0) |
|
50424
df3923c36ec5
Merged revisions 67952-67953,67955,67957-67958,67960-67961,67963,67965,67967,67970-67971,67973,67982,67988,67990,67995,68014,68016,68030,68057,68061,68112,68115-68118,68120-68121,68123-68128 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49351
diff
changeset
|
551 return -1; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
552 memcpy(p, (char *)&x, sizeof x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
553 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
554 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
555 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
556 #ifdef HAVE_LONG_LONG |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
557 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
558 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
559 np_longlong(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
560 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
561 PY_LONG_LONG x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
562 if (get_longlong(v, &x) < 0) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
563 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
564 memcpy(p, (char *)&x, sizeof x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
565 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
566 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
567 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
568 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
569 np_ulonglong(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
570 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
571 unsigned PY_LONG_LONG x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
572 if (get_ulonglong(v, &x) < 0) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
573 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
574 memcpy(p, (char *)&x, sizeof x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
575 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
576 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
577 #endif |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
578 |
|
40681
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
579 |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
580 static int |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
581 np_bool(char *p, PyObject *v, const formatdef *f) |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
582 { |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
583 BOOL_TYPE y; |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
584 y = PyObject_IsTrue(v); |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
585 memcpy(p, (char *)&y, sizeof y); |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
586 return 0; |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
587 } |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
588 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
589 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
590 np_float(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
591 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
592 float x = (float)PyFloat_AsDouble(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
593 if (x == -1 && PyErr_Occurred()) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
594 PyErr_SetString(StructError, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
595 "required argument is not a float"); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
596 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
597 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
598 memcpy(p, (char *)&x, sizeof x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
599 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
600 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
601 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
602 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
603 np_double(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
604 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
605 double x = PyFloat_AsDouble(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
606 if (x == -1 && PyErr_Occurred()) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
607 PyErr_SetString(StructError, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
608 "required argument is not a float"); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
609 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
610 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
611 memcpy(p, (char *)&x, sizeof(double)); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
612 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
613 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
614 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
615 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
616 np_void_p(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
617 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
618 void *x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
619 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
620 v = get_pylong(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
621 if (v == NULL) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
622 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
623 assert(PyLong_Check(v)); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
624 x = PyLong_AsVoidPtr(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
625 Py_DECREF(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
626 if (x == NULL && PyErr_Occurred()) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
627 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
628 memcpy(p, (char *)&x, sizeof x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
629 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
630 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
631 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
632 static formatdef native_table[] = { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
633 {'x', sizeof(char), 0, NULL}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
634 {'b', sizeof(char), 0, nu_byte, np_byte}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
635 {'B', sizeof(char), 0, nu_ubyte, np_ubyte}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
636 {'c', sizeof(char), 0, nu_char, np_char}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
637 {'s', sizeof(char), 0, NULL}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
638 {'p', sizeof(char), 0, NULL}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
639 {'h', sizeof(short), SHORT_ALIGN, nu_short, np_short}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
640 {'H', sizeof(short), SHORT_ALIGN, nu_ushort, np_ushort}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
641 {'i', sizeof(int), INT_ALIGN, nu_int, np_int}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
642 {'I', sizeof(int), INT_ALIGN, nu_uint, np_uint}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
643 {'l', sizeof(long), LONG_ALIGN, nu_long, np_long}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
644 {'L', sizeof(long), LONG_ALIGN, nu_ulong, np_ulong}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
645 #ifdef HAVE_LONG_LONG |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
646 {'q', sizeof(PY_LONG_LONG), LONG_LONG_ALIGN, nu_longlong, np_longlong}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
647 {'Q', sizeof(PY_LONG_LONG), LONG_LONG_ALIGN, nu_ulonglong,np_ulonglong}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
648 #endif |
|
45672
d41a4206405c
Issue 1872: Changed the struct module typecode from 't' to '?', for
Thomas Heller <theller@ctypes.org>
parents:
45373
diff
changeset
|
649 {'?', sizeof(BOOL_TYPE), BOOL_ALIGN, nu_bool, np_bool}, |
|
38317
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
650 {'f', sizeof(float), FLOAT_ALIGN, nu_float, np_float}, |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
651 {'d', sizeof(double), DOUBLE_ALIGN, nu_double, np_double}, |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
652 {'P', sizeof(void *), VOID_P_ALIGN, nu_void_p, np_void_p}, |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
653 {0} |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
654 }; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
655 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
656 /* Big-endian routines. *****************************************************/ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
657 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
658 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
659 bu_int(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
660 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
661 long x = 0; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
662 Py_ssize_t i = f->size; |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
663 const unsigned char *bytes = (const unsigned char *)p; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
664 do { |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
665 x = (x<<8) | *bytes++; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
666 } while (--i > 0); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
667 /* Extend the sign bit. */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
668 if (SIZEOF_LONG > f->size) |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
669 x |= -(x & (1L << ((8 * f->size) - 1))); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
670 return PyInt_FromLong(x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
671 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
672 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
673 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
674 bu_uint(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
675 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
676 unsigned long x = 0; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
677 Py_ssize_t i = f->size; |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
678 const unsigned char *bytes = (const unsigned char *)p; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
679 do { |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
680 x = (x<<8) | *bytes++; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
681 } while (--i > 0); |
|
38316
2f16e2715223
Use LONG_MIN and LONG_MAX to check Python integer bounds instead of the incorrect INT_MIN and INT_MAX
Bob Ippolito <bob@redivi.com>
parents:
38313
diff
changeset
|
682 if (x <= LONG_MAX) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
683 return PyInt_FromLong((long)x); |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
684 return PyLong_FromUnsignedLong(x); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
685 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
686 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
687 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
688 bu_longlong(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
689 { |
|
38429
003433511e4d
Remove the range checking and int usage #defines from _struct and strip out the now-dead code
Bob Ippolito <bob@redivi.com>
parents:
38411
diff
changeset
|
690 #ifdef HAVE_LONG_LONG |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
691 PY_LONG_LONG x = 0; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
692 Py_ssize_t i = f->size; |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
693 const unsigned char *bytes = (const unsigned char *)p; |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
694 do { |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
695 x = (x<<8) | *bytes++; |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
696 } while (--i > 0); |
|
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
697 /* Extend the sign bit. */ |
|
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
698 if (SIZEOF_LONG_LONG > f->size) |
|
41526
708c8c5fc173
Make pythoncore compile cleanly with VisualStudio 2005. Used an explicit typecast to get a 64 bit integer, and undefined the Yield macro that conflicts with winbase.h
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
41391
diff
changeset
|
699 x |= -(x & ((PY_LONG_LONG)1 << ((8 * f->size) - 1))); |
|
38316
2f16e2715223
Use LONG_MIN and LONG_MAX to check Python integer bounds instead of the incorrect INT_MIN and INT_MAX
Bob Ippolito <bob@redivi.com>
parents:
38313
diff
changeset
|
700 if (x >= LONG_MIN && x <= LONG_MAX) |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
701 return PyInt_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long)); |
|
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
702 return PyLong_FromLongLong(x); |
|
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
703 #else |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
704 return _PyLong_FromByteArray((const unsigned char *)p, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
705 8, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
706 0, /* little-endian */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
707 1 /* signed */); |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
708 #endif |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
709 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
710 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
711 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
712 bu_ulonglong(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
713 { |
|
38429
003433511e4d
Remove the range checking and int usage #defines from _struct and strip out the now-dead code
Bob Ippolito <bob@redivi.com>
parents:
38411
diff
changeset
|
714 #ifdef HAVE_LONG_LONG |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
715 unsigned PY_LONG_LONG x = 0; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
716 Py_ssize_t i = f->size; |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
717 const unsigned char *bytes = (const unsigned char *)p; |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
718 do { |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
719 x = (x<<8) | *bytes++; |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
720 } while (--i > 0); |
|
38316
2f16e2715223
Use LONG_MIN and LONG_MAX to check Python integer bounds instead of the incorrect INT_MIN and INT_MAX
Bob Ippolito <bob@redivi.com>
parents:
38313
diff
changeset
|
721 if (x <= LONG_MAX) |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
722 return PyInt_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long)); |
|
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
723 return PyLong_FromUnsignedLongLong(x); |
|
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
724 #else |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
725 return _PyLong_FromByteArray((const unsigned char *)p, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
726 8, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
727 0, /* little-endian */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
728 0 /* signed */); |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
729 #endif |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
730 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
731 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
732 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
733 bu_float(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
734 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
735 return unpack_float(p, 0); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
736 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
737 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
738 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
739 bu_double(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
740 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
741 return unpack_double(p, 0); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
742 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
743 |
|
40681
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
744 static PyObject * |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
745 bu_bool(const char *p, const formatdef *f) |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
746 { |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
747 char x; |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
748 memcpy((char *)&x, p, sizeof x); |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
749 return PyBool_FromLong(x != 0); |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
750 } |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
751 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
752 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
753 bp_int(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
754 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
755 long x; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
756 Py_ssize_t i; |
|
56246
3dec3b77b787
Eliminate unnecessary get_wrapped_(u)long defines in struct module.
Mark Dickinson <dickinsm@gmail.com>
parents:
55153
diff
changeset
|
757 if (get_long(v, &x) < 0) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
758 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
759 i = f->size; |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
760 if (i != SIZEOF_LONG) { |
|
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
761 if ((i == 2) && (x < -32768 || x > 32767)) |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
762 return _range_error(f, 0); |
|
38429
003433511e4d
Remove the range checking and int usage #defines from _struct and strip out the now-dead code
Bob Ippolito <bob@redivi.com>
parents:
38411
diff
changeset
|
763 #if (SIZEOF_LONG != 4) |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
764 else if ((i == 4) && (x < -2147483648L || x > 2147483647L)) |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
765 return _range_error(f, 0); |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
766 #endif |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
767 } |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
768 do { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
769 p[--i] = (char)x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
770 x >>= 8; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
771 } while (i > 0); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
772 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
773 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
774 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
775 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
776 bp_uint(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
777 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
778 unsigned long x; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
779 Py_ssize_t i; |
|
56246
3dec3b77b787
Eliminate unnecessary get_wrapped_(u)long defines in struct module.
Mark Dickinson <dickinsm@gmail.com>
parents:
55153
diff
changeset
|
780 if (get_ulong(v, &x) < 0) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
781 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
782 i = f->size; |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
783 if (i != SIZEOF_LONG) { |
|
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
784 unsigned long maxint = 1; |
|
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
785 maxint <<= (unsigned long)(i * 8); |
|
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
786 if (x >= maxint) |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
787 return _range_error(f, 1); |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
788 } |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
789 do { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
790 p[--i] = (char)x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
791 x >>= 8; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
792 } while (i > 0); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
793 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
794 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
795 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
796 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
797 bp_longlong(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
798 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
799 int res; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
800 v = get_pylong(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
801 if (v == NULL) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
802 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
803 res = _PyLong_AsByteArray((PyLongObject *)v, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
804 (unsigned char *)p, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
805 8, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
806 0, /* little_endian */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
807 1 /* signed */); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
808 Py_DECREF(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
809 return res; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
810 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
811 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
812 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
813 bp_ulonglong(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
814 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
815 int res; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
816 v = get_pylong(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
817 if (v == NULL) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
818 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
819 res = _PyLong_AsByteArray((PyLongObject *)v, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
820 (unsigned char *)p, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
821 8, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
822 0, /* little_endian */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
823 0 /* signed */); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
824 Py_DECREF(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
825 return res; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
826 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
827 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
828 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
829 bp_float(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
830 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
831 double x = PyFloat_AsDouble(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
832 if (x == -1 && PyErr_Occurred()) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
833 PyErr_SetString(StructError, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
834 "required argument is not a float"); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
835 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
836 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
837 return _PyFloat_Pack4(x, (unsigned char *)p, 0); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
838 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
839 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
840 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
841 bp_double(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
842 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
843 double x = PyFloat_AsDouble(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
844 if (x == -1 && PyErr_Occurred()) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
845 PyErr_SetString(StructError, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
846 "required argument is not a float"); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
847 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
848 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
849 return _PyFloat_Pack8(x, (unsigned char *)p, 0); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
850 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
851 |
|
40681
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
852 static int |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
853 bp_bool(char *p, PyObject *v, const formatdef *f) |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
854 { |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
855 char y; |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
856 y = PyObject_IsTrue(v); |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
857 memcpy(p, (char *)&y, sizeof y); |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
858 return 0; |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
859 } |
|
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
860 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
861 static formatdef bigendian_table[] = { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
862 {'x', 1, 0, NULL}, |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
863 {'b', 1, 0, nu_byte, np_byte}, |
|
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
864 {'B', 1, 0, nu_ubyte, np_ubyte}, |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
865 {'c', 1, 0, nu_char, np_char}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
866 {'s', 1, 0, NULL}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
867 {'p', 1, 0, NULL}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
868 {'h', 2, 0, bu_int, bp_int}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
869 {'H', 2, 0, bu_uint, bp_uint}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
870 {'i', 4, 0, bu_int, bp_int}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
871 {'I', 4, 0, bu_uint, bp_uint}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
872 {'l', 4, 0, bu_int, bp_int}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
873 {'L', 4, 0, bu_uint, bp_uint}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
874 {'q', 8, 0, bu_longlong, bp_longlong}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
875 {'Q', 8, 0, bu_ulonglong, bp_ulonglong}, |
|
45672
d41a4206405c
Issue 1872: Changed the struct module typecode from 't' to '?', for
Thomas Heller <theller@ctypes.org>
parents:
45373
diff
changeset
|
876 {'?', 1, 0, bu_bool, bp_bool}, |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
877 {'f', 4, 0, bu_float, bp_float}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
878 {'d', 8, 0, bu_double, bp_double}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
879 {0} |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
880 }; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
881 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
882 /* Little-endian routines. *****************************************************/ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
883 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
884 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
885 lu_int(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
886 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
887 long x = 0; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
888 Py_ssize_t i = f->size; |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
889 const unsigned char *bytes = (const unsigned char *)p; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
890 do { |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
891 x = (x<<8) | bytes[--i]; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
892 } while (i > 0); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
893 /* Extend the sign bit. */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
894 if (SIZEOF_LONG > f->size) |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
895 x |= -(x & (1L << ((8 * f->size) - 1))); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
896 return PyInt_FromLong(x); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
897 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
898 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
899 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
900 lu_uint(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
901 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
902 unsigned long x = 0; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
903 Py_ssize_t i = f->size; |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
904 const unsigned char *bytes = (const unsigned char *)p; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
905 do { |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
906 x = (x<<8) | bytes[--i]; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
907 } while (i > 0); |
|
38316
2f16e2715223
Use LONG_MIN and LONG_MAX to check Python integer bounds instead of the incorrect INT_MIN and INT_MAX
Bob Ippolito <bob@redivi.com>
parents:
38313
diff
changeset
|
908 if (x <= LONG_MAX) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
909 return PyInt_FromLong((long)x); |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
910 return PyLong_FromUnsignedLong((long)x); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
911 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
912 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
913 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
914 lu_longlong(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
915 { |
|
38429
003433511e4d
Remove the range checking and int usage #defines from _struct and strip out the now-dead code
Bob Ippolito <bob@redivi.com>
parents:
38411
diff
changeset
|
916 #ifdef HAVE_LONG_LONG |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
917 PY_LONG_LONG x = 0; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
918 Py_ssize_t i = f->size; |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
919 const unsigned char *bytes = (const unsigned char *)p; |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
920 do { |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
921 x = (x<<8) | bytes[--i]; |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
922 } while (i > 0); |
|
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
923 /* Extend the sign bit. */ |
|
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
924 if (SIZEOF_LONG_LONG > f->size) |
|
41526
708c8c5fc173
Make pythoncore compile cleanly with VisualStudio 2005. Used an explicit typecast to get a 64 bit integer, and undefined the Yield macro that conflicts with winbase.h
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
41391
diff
changeset
|
925 x |= -(x & ((PY_LONG_LONG)1 << ((8 * f->size) - 1))); |
|
38316
2f16e2715223
Use LONG_MIN and LONG_MAX to check Python integer bounds instead of the incorrect INT_MIN and INT_MAX
Bob Ippolito <bob@redivi.com>
parents:
38313
diff
changeset
|
926 if (x >= LONG_MIN && x <= LONG_MAX) |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
927 return PyInt_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long)); |
|
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
928 return PyLong_FromLongLong(x); |
|
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
929 #else |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
930 return _PyLong_FromByteArray((const unsigned char *)p, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
931 8, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
932 1, /* little-endian */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
933 1 /* signed */); |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
934 #endif |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
935 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
936 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
937 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
938 lu_ulonglong(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
939 { |
|
38429
003433511e4d
Remove the range checking and int usage #defines from _struct and strip out the now-dead code
Bob Ippolito <bob@redivi.com>
parents:
38411
diff
changeset
|
940 #ifdef HAVE_LONG_LONG |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
941 unsigned PY_LONG_LONG x = 0; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
942 Py_ssize_t i = f->size; |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
943 const unsigned char *bytes = (const unsigned char *)p; |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
944 do { |
|
38483
fb56a3992604
simplify the struct code a bit (no functional changes)
Bob Ippolito <bob@redivi.com>
parents:
38470
diff
changeset
|
945 x = (x<<8) | bytes[--i]; |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
946 } while (i > 0); |
|
38316
2f16e2715223
Use LONG_MIN and LONG_MAX to check Python integer bounds instead of the incorrect INT_MIN and INT_MAX
Bob Ippolito <bob@redivi.com>
parents:
38313
diff
changeset
|
947 if (x <= LONG_MAX) |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
948 return PyInt_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long)); |
|
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
949 return PyLong_FromUnsignedLongLong(x); |
|
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
950 #else |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
951 return _PyLong_FromByteArray((const unsigned char *)p, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
952 8, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
953 1, /* little-endian */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
954 0 /* signed */); |
|
38310
850d4f7717b8
Struct now unpacks to PY_LONG_LONG directly when possible, also include #ifdef'ed out code that will return int instead of long when in bounds (not active since it's an API and doc change)
Bob Ippolito <bob@redivi.com>
parents:
38277
diff
changeset
|
955 #endif |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
956 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
957 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
958 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
959 lu_float(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
960 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
961 return unpack_float(p, 1); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
962 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
963 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
964 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
965 lu_double(const char *p, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
966 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
967 return unpack_double(p, 1); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
968 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
969 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
970 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
971 lp_int(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
972 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
973 long x; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
974 Py_ssize_t i; |
|
56246
3dec3b77b787
Eliminate unnecessary get_wrapped_(u)long defines in struct module.
Mark Dickinson <dickinsm@gmail.com>
parents:
55153
diff
changeset
|
975 if (get_long(v, &x) < 0) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
976 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
977 i = f->size; |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
978 if (i != SIZEOF_LONG) { |
|
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
979 if ((i == 2) && (x < -32768 || x > 32767)) |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
980 return _range_error(f, 0); |
|
38429
003433511e4d
Remove the range checking and int usage #defines from _struct and strip out the now-dead code
Bob Ippolito <bob@redivi.com>
parents:
38411
diff
changeset
|
981 #if (SIZEOF_LONG != 4) |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
982 else if ((i == 4) && (x < -2147483648L || x > 2147483647L)) |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
983 return _range_error(f, 0); |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
984 #endif |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
985 } |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
986 do { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
987 *p++ = (char)x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
988 x >>= 8; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
989 } while (--i > 0); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
990 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
991 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
992 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
993 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
994 lp_uint(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
995 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
996 unsigned long x; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
997 Py_ssize_t i; |
|
56246
3dec3b77b787
Eliminate unnecessary get_wrapped_(u)long defines in struct module.
Mark Dickinson <dickinsm@gmail.com>
parents:
55153
diff
changeset
|
998 if (get_ulong(v, &x) < 0) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
999 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1000 i = f->size; |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
1001 if (i != SIZEOF_LONG) { |
|
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
1002 unsigned long maxint = 1; |
|
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
1003 maxint <<= (unsigned long)(i * 8); |
|
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
1004 if (x >= maxint) |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1005 return _range_error(f, 1); |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
1006 } |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1007 do { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1008 *p++ = (char)x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1009 x >>= 8; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1010 } while (--i > 0); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1011 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1012 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1013 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1014 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1015 lp_longlong(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1016 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1017 int res; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1018 v = get_pylong(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1019 if (v == NULL) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1020 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1021 res = _PyLong_AsByteArray((PyLongObject*)v, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1022 (unsigned char *)p, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1023 8, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1024 1, /* little_endian */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1025 1 /* signed */); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1026 Py_DECREF(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1027 return res; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1028 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1029 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1030 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1031 lp_ulonglong(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1032 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1033 int res; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1034 v = get_pylong(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1035 if (v == NULL) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1036 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1037 res = _PyLong_AsByteArray((PyLongObject*)v, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1038 (unsigned char *)p, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1039 8, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1040 1, /* little_endian */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1041 0 /* signed */); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1042 Py_DECREF(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1043 return res; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1044 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1045 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1046 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1047 lp_float(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1048 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1049 double x = PyFloat_AsDouble(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1050 if (x == -1 && PyErr_Occurred()) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1051 PyErr_SetString(StructError, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1052 "required argument is not a float"); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1053 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1054 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1055 return _PyFloat_Pack4(x, (unsigned char *)p, 1); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1056 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1057 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1058 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1059 lp_double(char *p, PyObject *v, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1060 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1061 double x = PyFloat_AsDouble(v); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1062 if (x == -1 && PyErr_Occurred()) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1063 PyErr_SetString(StructError, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1064 "required argument is not a float"); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1065 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1066 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1067 return _PyFloat_Pack8(x, (unsigned char *)p, 1); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1068 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1069 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1070 static formatdef lilendian_table[] = { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1071 {'x', 1, 0, NULL}, |
|
38363
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
1072 {'b', 1, 0, nu_byte, np_byte}, |
|
5213b6065197
fix #1229380 No struct.pack exception for some out of range integers
Bob Ippolito <bob@redivi.com>
parents:
38353
diff
changeset
|
1073 {'B', 1, 0, nu_ubyte, np_ubyte}, |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1074 {'c', 1, 0, nu_char, np_char}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1075 {'s', 1, 0, NULL}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1076 {'p', 1, 0, NULL}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1077 {'h', 2, 0, lu_int, lp_int}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1078 {'H', 2, 0, lu_uint, lp_uint}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1079 {'i', 4, 0, lu_int, lp_int}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1080 {'I', 4, 0, lu_uint, lp_uint}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1081 {'l', 4, 0, lu_int, lp_int}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1082 {'L', 4, 0, lu_uint, lp_uint}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1083 {'q', 8, 0, lu_longlong, lp_longlong}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1084 {'Q', 8, 0, lu_ulonglong, lp_ulonglong}, |
|
45672
d41a4206405c
Issue 1872: Changed the struct module typecode from 't' to '?', for
Thomas Heller <theller@ctypes.org>
parents:
45373
diff
changeset
|
1085 {'?', 1, 0, bu_bool, bp_bool}, /* Std rep not endian dep, |
|
40681
0bffca64ccc4
Patch #1610575: Add support for _Bool to struct.
Martin v. Löwis <martin@v.loewis.de>
parents:
39380
diff
changeset
|
1086 but potentially different from native rep -- reuse bx_bool funcs. */ |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1087 {'f', 4, 0, lu_float, lp_float}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1088 {'d', 8, 0, lu_double, lp_double}, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1089 {0} |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1090 }; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1091 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1092 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1093 static const formatdef * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1094 whichtable(char **pfmt) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1095 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1096 const char *fmt = (*pfmt)++; /* May be backed out of later */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1097 switch (*fmt) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1098 case '<': |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1099 return lilendian_table; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1100 case '>': |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1101 case '!': /* Network byte order is big-endian */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1102 return bigendian_table; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1103 case '=': { /* Host byte order -- different from native in aligment! */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1104 int n = 1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1105 char *p = (char *) &n; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1106 if (*p == 1) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1107 return lilendian_table; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1108 else |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1109 return bigendian_table; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1110 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1111 default: |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1112 --*pfmt; /* Back out of pointer increment */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1113 /* Fall through */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1114 case '@': |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1115 return native_table; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1116 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1117 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1118 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1119 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1120 /* Get the table entry for a format code */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1121 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1122 static const formatdef * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1123 getentry(int c, const formatdef *f) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1124 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1125 for (; f->format != '\0'; f++) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1126 if (f->format == c) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1127 return f; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1128 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1129 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1130 PyErr_SetString(StructError, "bad char in struct format"); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1131 return NULL; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1132 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1133 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1134 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1135 /* Align a size according to a format code */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1136 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1137 static int |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1138 align(Py_ssize_t size, char c, const formatdef *e) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1139 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1140 if (e->format == c) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1141 if (e->alignment) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1142 size = ((size + e->alignment - 1) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1143 / e->alignment) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1144 * e->alignment; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1145 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1146 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1147 return size; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1148 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1149 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1150 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1151 /* calculate the size of a format string */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1152 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1153 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1154 prepare_s(PyStructObject *self) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1155 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1156 const formatdef *f; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1157 const formatdef *e; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1158 formatcode *codes; |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1159 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1160 const char *s; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1161 const char *fmt; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1162 char c; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1163 Py_ssize_t size, len, num, itemsize, x; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1164 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1165 fmt = PyString_AS_STRING(self->s_format); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1166 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1167 f = whichtable((char **)&fmt); |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1168 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1169 s = fmt; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1170 size = 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1171 len = 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1172 while ((c = *s++) != '\0') { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1173 if (isspace(Py_CHARMASK(c))) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1174 continue; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1175 if ('0' <= c && c <= '9') { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1176 num = c - '0'; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1177 while ('0' <= (c = *s++) && c <= '9') { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1178 x = num*10 + (c - '0'); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1179 if (x/10 != num) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1180 PyErr_SetString( |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1181 StructError, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1182 "overflow in item count"); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1183 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1184 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1185 num = x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1186 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1187 if (c == '\0') |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1188 break; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1189 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1190 else |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1191 num = 1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1192 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1193 e = getentry(c, f); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1194 if (e == NULL) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1195 return -1; |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1196 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1197 switch (c) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1198 case 's': /* fall through */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1199 case 'p': len++; break; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1200 case 'x': break; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1201 default: len += num; break; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1202 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1203 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1204 itemsize = e->size; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1205 size = align(size, c, e); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1206 x = num * itemsize; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1207 size += x; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1208 if (x/itemsize != num || size < 0) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1209 PyErr_SetString(StructError, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1210 "total struct size too long"); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1211 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1212 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1213 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1214 |
|
47587
1c964ed35ef9
Merge in release25-maint r60793:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
1215 /* check for overflow */ |
|
1c964ed35ef9
Merge in release25-maint r60793:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
1216 if ((len + 1) > (PY_SSIZE_T_MAX / sizeof(formatcode))) { |
|
1c964ed35ef9
Merge in release25-maint r60793:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
1217 PyErr_NoMemory(); |
|
1c964ed35ef9
Merge in release25-maint r60793:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
1218 return -1; |
|
1c964ed35ef9
Merge in release25-maint r60793:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
1219 } |
|
1c964ed35ef9
Merge in release25-maint r60793:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47527
diff
changeset
|
1220 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1221 self->s_size = size; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1222 self->s_len = len; |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1223 codes = PyMem_MALLOC((len + 1) * sizeof(formatcode)); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1224 if (codes == NULL) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1225 PyErr_NoMemory(); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1226 return -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1227 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1228 self->s_codes = codes; |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1229 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1230 s = fmt; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1231 size = 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1232 while ((c = *s++) != '\0') { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1233 if (isspace(Py_CHARMASK(c))) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1234 continue; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1235 if ('0' <= c && c <= '9') { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1236 num = c - '0'; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1237 while ('0' <= (c = *s++) && c <= '9') |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1238 num = num*10 + (c - '0'); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1239 if (c == '\0') |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1240 break; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1241 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1242 else |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1243 num = 1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1244 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1245 e = getentry(c, f); |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1246 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1247 size = align(size, c, e); |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1248 if (c == 's' || c == 'p') { |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1249 codes->offset = size; |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1250 codes->size = num; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1251 codes->fmtdef = e; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1252 codes++; |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1253 size += num; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1254 } else if (c == 'x') { |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1255 size += num; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1256 } else { |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1257 while (--num >= 0) { |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1258 codes->offset = size; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1259 codes->size = e->size; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1260 codes->fmtdef = e; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1261 codes++; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1262 size += e->size; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1263 } |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1264 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1265 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1266 codes->fmtdef = NULL; |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1267 codes->offset = size; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1268 codes->size = 0; |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1269 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1270 return 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1271 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1272 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1273 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1274 s_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1275 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1276 PyObject *self; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1277 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1278 assert(type != NULL && type->tp_alloc != NULL); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1279 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1280 self = type->tp_alloc(type, 0); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1281 if (self != NULL) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1282 PyStructObject *s = (PyStructObject*)self; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1283 Py_INCREF(Py_None); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1284 s->s_format = Py_None; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1285 s->s_codes = NULL; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1286 s->s_size = -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1287 s->s_len = -1; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1288 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1289 return self; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1290 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1291 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1292 static int |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1293 s_init(PyObject *self, PyObject *args, PyObject *kwds) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1294 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1295 PyStructObject *soself = (PyStructObject *)self; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1296 PyObject *o_format = NULL; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1297 int ret = 0; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1298 static char *kwlist[] = {"format", 0}; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1299 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1300 assert(PyStruct_Check(self)); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1301 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1302 if (!PyArg_ParseTupleAndKeywords(args, kwds, "S:Struct", kwlist, |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1303 &o_format)) |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1304 return -1; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1305 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1306 Py_INCREF(o_format); |
|
45373
f378edd21df2
Crashers of the day: Py_CLEAR must be used when there is a chance that the
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
44733
diff
changeset
|
1307 Py_CLEAR(soself->s_format); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1308 soself->s_format = o_format; |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1309 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1310 ret = prepare_s(soself); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1311 return ret; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1312 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1313 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1314 static void |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1315 s_dealloc(PyStructObject *s) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1316 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1317 if (s->weakreflist != NULL) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1318 PyObject_ClearWeakRefs((PyObject *)s); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1319 if (s->s_codes != NULL) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1320 PyMem_FREE(s->s_codes); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1321 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1322 Py_XDECREF(s->s_format); |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
42333
diff
changeset
|
1323 Py_TYPE(s)->tp_free((PyObject *)s); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1324 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1325 |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1326 static PyObject * |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1327 s_unpack_internal(PyStructObject *soself, char *startfrom) { |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1328 formatcode *code; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1329 Py_ssize_t i = 0; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1330 PyObject *result = PyTuple_New(soself->s_len); |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1331 if (result == NULL) |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1332 return NULL; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1333 |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1334 for (code = soself->s_codes; code->fmtdef != NULL; code++) { |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1335 PyObject *v; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1336 const formatdef *e = code->fmtdef; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1337 const char *res = startfrom + code->offset; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1338 if (e->format == 's') { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1339 v = PyString_FromStringAndSize(res, code->size); |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1340 } else if (e->format == 'p') { |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1341 Py_ssize_t n = *(unsigned char*)res; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1342 if (n >= code->size) |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1343 n = code->size - 1; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1344 v = PyString_FromStringAndSize(res + 1, n); |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1345 } else { |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1346 v = e->unpack(res, e); |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1347 } |
| 38736 | 1348 if (v == NULL) |
| 1349 goto fail; | |
| 1350 PyTuple_SET_ITEM(result, i++, v); | |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1351 } |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1352 |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1353 return result; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1354 fail: |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1355 Py_DECREF(result); |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1356 return NULL; |
|
38445
8daeb9af8422
fix struct regression on 64-bit platforms
Bob Ippolito <bob@redivi.com>
parents:
38430
diff
changeset
|
1357 } |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1358 |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1359 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1360 PyDoc_STRVAR(s_unpack__doc__, |
|
38430
795d1cb1df01
Fix up struct docstrings, add struct.pack_to function for symmetry
Bob Ippolito <bob@redivi.com>
parents:
38429
diff
changeset
|
1361 "S.unpack(str) -> (v1, v2, ...)\n\ |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1362 \n\ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1363 Return tuple containing values unpacked according to this Struct's format.\n\ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1364 Requires len(str) == self.size. See struct.__doc__ for more on format\n\ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1365 strings."); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1366 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1367 static PyObject * |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1368 s_unpack(PyObject *self, PyObject *inputstr) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1369 { |
|
41391
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1370 char *start; |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1371 Py_ssize_t len; |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1372 PyObject *args=NULL, *result; |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1373 PyStructObject *soself = (PyStructObject *)self; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1374 assert(PyStruct_Check(self)); |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1375 assert(soself->s_codes != NULL); |
|
41391
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1376 if (inputstr == NULL) |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1377 goto fail; |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1378 if (PyString_Check(inputstr) && |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1379 PyString_GET_SIZE(inputstr) == soself->s_size) { |
|
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1380 return s_unpack_internal(soself, PyString_AS_STRING(inputstr)); |
|
41391
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1381 } |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1382 args = PyTuple_Pack(1, inputstr); |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1383 if (args == NULL) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1384 return NULL; |
|
41391
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1385 if (!PyArg_ParseTuple(args, "s#:unpack", &start, &len)) |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1386 goto fail; |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1387 if (soself->s_size != len) |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1388 goto fail; |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1389 result = s_unpack_internal(soself, start); |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1390 Py_DECREF(args); |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1391 return result; |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1392 |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1393 fail: |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1394 Py_XDECREF(args); |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1395 PyErr_Format(StructError, |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1396 "unpack requires a string argument of length %zd", |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1397 soself->s_size); |
|
80ff75fa2754
Bug #1563759: struct.unpack doens't support buffer protocol objects
Raymond Hettinger <python@rcn.com>
parents:
40681
diff
changeset
|
1398 return NULL; |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1399 } |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1400 |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1401 PyDoc_STRVAR(s_unpack_from__doc__, |
|
38430
795d1cb1df01
Fix up struct docstrings, add struct.pack_to function for symmetry
Bob Ippolito <bob@redivi.com>
parents:
38429
diff
changeset
|
1402 "S.unpack_from(buffer[, offset]) -> (v1, v2, ...)\n\ |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1403 \n\ |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1404 Return tuple containing values unpacked according to this Struct's format.\n\ |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1405 Unlike unpack, unpack_from can unpack values from any object supporting\n\ |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1406 the buffer API, not just str. Requires len(buffer[offset:]) >= self.size.\n\ |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1407 See struct.__doc__ for more on format strings."); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1408 |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1409 static PyObject * |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1410 s_unpack_from(PyObject *self, PyObject *args, PyObject *kwds) |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1411 { |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1412 static char *kwlist[] = {"buffer", "offset", 0}; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1413 #if (PY_VERSION_HEX < 0x02050000) |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1414 static char *fmt = "z#|i:unpack_from"; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1415 #else |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1416 static char *fmt = "z#|n:unpack_from"; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1417 #endif |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1418 Py_ssize_t buffer_len = 0, offset = 0; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1419 char *buffer = NULL; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1420 PyStructObject *soself = (PyStructObject *)self; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1421 assert(PyStruct_Check(self)); |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1422 assert(soself->s_codes != NULL); |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1423 |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1424 if (!PyArg_ParseTupleAndKeywords(args, kwds, fmt, kwlist, |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1425 &buffer, &buffer_len, &offset)) |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1426 return NULL; |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1427 |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1428 if (buffer == NULL) { |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1429 PyErr_Format(StructError, |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1430 "unpack_from requires a buffer argument"); |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1431 return NULL; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1432 } |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1433 |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1434 if (offset < 0) |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1435 offset += buffer_len; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1436 |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1437 if (offset < 0 || (buffer_len - offset) < soself->s_size) { |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1438 PyErr_Format(StructError, |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1439 "unpack_from requires a buffer of at least %zd bytes", |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1440 soself->s_size); |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1441 return NULL; |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1442 } |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1443 return s_unpack_internal(soself, buffer + offset); |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1444 } |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1445 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1446 |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1447 /* |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1448 * Guts of the pack function. |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1449 * |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1450 * Takes a struct object, a tuple of arguments, and offset in that tuple of |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1451 * argument for where to start processing the arguments for packing, and a |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1452 * character buffer for writing the packed string. The caller must insure |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1453 * that the buffer may contain the required length for packing the arguments. |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1454 * 0 is returned on success, 1 is returned if there is an error. |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1455 * |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1456 */ |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1457 static int |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1458 s_pack_internal(PyStructObject *soself, PyObject *args, int offset, char* buf) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1459 { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1460 formatcode *code; |
| 38736 | 1461 /* XXX(nnorwitz): why does i need to be a local? can we use |
| 1462 the offset parameter or do we need the wider width? */ | |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1463 Py_ssize_t i; |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1464 |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1465 memset(buf, '\0', soself->s_size); |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1466 i = offset; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1467 for (code = soself->s_codes; code->fmtdef != NULL; code++) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1468 Py_ssize_t n; |
| 38736 | 1469 PyObject *v = PyTuple_GET_ITEM(args, i++); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1470 const formatdef *e = code->fmtdef; |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1471 char *res = buf + code->offset; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1472 if (e->format == 's') { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1473 if (!PyString_Check(v)) { |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1474 PyErr_SetString(StructError, |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1475 "argument for 's' must " |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1476 "be a string"); |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1477 return -1; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1478 } |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1479 n = PyString_GET_SIZE(v); |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1480 if (n > code->size) |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1481 n = code->size; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1482 if (n > 0) |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1483 memcpy(res, PyString_AS_STRING(v), n); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1484 } else if (e->format == 'p') { |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1485 if (!PyString_Check(v)) { |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1486 PyErr_SetString(StructError, |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1487 "argument for 'p' must " |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1488 "be a string"); |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1489 return -1; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1490 } |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1491 n = PyString_GET_SIZE(v); |
|
38277
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1492 if (n > (code->size - 1)) |
|
b825e6227366
refactor unpack, add unpack_from
Bob Ippolito <bob@redivi.com>
parents:
38267
diff
changeset
|
1493 n = code->size - 1; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1494 if (n > 0) |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1495 memcpy(res + 1, PyString_AS_STRING(v), n); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1496 if (n > 255) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1497 n = 255; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1498 *res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char); |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1499 } else if (e->pack(res, v, e) < 0) { |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1500 if (strchr(integer_codes, e->format) != NULL && |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1501 PyErr_ExceptionMatches(PyExc_OverflowError)) |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1502 PyErr_Format(StructError, |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1503 "integer out of range for " |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1504 "'%c' format code", |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1505 e->format); |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1506 return -1; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1507 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1508 } |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1509 |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1510 /* Success */ |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1511 return 0; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1512 } |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1513 |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1514 |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1515 PyDoc_STRVAR(s_pack__doc__, |
|
38430
795d1cb1df01
Fix up struct docstrings, add struct.pack_to function for symmetry
Bob Ippolito <bob@redivi.com>
parents:
38429
diff
changeset
|
1516 "S.pack(v1, v2, ...) -> string\n\ |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1517 \n\ |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1518 Return a string containing values v1, v2, ... packed according to this\n\ |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1519 Struct's format. See struct.__doc__ for more on format strings."); |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1520 |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1521 static PyObject * |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1522 s_pack(PyObject *self, PyObject *args) |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1523 { |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1524 PyStructObject *soself; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1525 PyObject *result; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1526 |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1527 /* Validate arguments. */ |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1528 soself = (PyStructObject *)self; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1529 assert(PyStruct_Check(self)); |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1530 assert(soself->s_codes != NULL); |
|
38580
a114003aa3d3
Fixes in struct and socket from merge reviews.
Martin Blais <blais@furius.ca>
parents:
38530
diff
changeset
|
1531 if (PyTuple_GET_SIZE(args) != soself->s_len) |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1532 { |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1533 PyErr_Format(StructError, |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1534 "pack requires exactly %zd arguments", soself->s_len); |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1535 return NULL; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1536 } |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1537 |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1538 /* Allocate a new string */ |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1539 result = PyString_FromStringAndSize((char *)NULL, soself->s_size); |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1540 if (result == NULL) |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1541 return NULL; |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1542 |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1543 /* Call the guts */ |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1544 if ( s_pack_internal(soself, args, 0, PyString_AS_STRING(result)) != 0 ) { |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1545 Py_DECREF(result); |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1546 return NULL; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1547 } |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1548 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1549 return result; |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1550 } |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1551 |
|
38580
a114003aa3d3
Fixes in struct and socket from merge reviews.
Martin Blais <blais@furius.ca>
parents:
38530
diff
changeset
|
1552 PyDoc_STRVAR(s_pack_into__doc__, |
|
a114003aa3d3
Fixes in struct and socket from merge reviews.
Martin Blais <blais@furius.ca>
parents:
38530
diff
changeset
|
1553 "S.pack_into(buffer, offset, v1, v2, ...)\n\ |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1554 \n\ |
|
38580
a114003aa3d3
Fixes in struct and socket from merge reviews.
Martin Blais <blais@furius.ca>
parents:
38530
diff
changeset
|
1555 Pack the values v1, v2, ... according to this Struct's format, write \n\ |
|
38430
795d1cb1df01
Fix up struct docstrings, add struct.pack_to function for symmetry
Bob Ippolito <bob@redivi.com>
parents:
38429
diff
changeset
|
1556 the packed bytes into the writable buffer buf starting at offset. Note\n\ |
|
795d1cb1df01
Fix up struct docstrings, add struct.pack_to function for symmetry
Bob Ippolito <bob@redivi.com>
parents:
38429
diff
changeset
|
1557 that the offset is not an optional argument. See struct.__doc__ for \n\ |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1558 more on format strings."); |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1559 |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1560 static PyObject * |
|
38580
a114003aa3d3
Fixes in struct and socket from merge reviews.
Martin Blais <blais@furius.ca>
parents:
38530
diff
changeset
|
1561 s_pack_into(PyObject *self, PyObject *args) |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1562 { |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1563 PyStructObject *soself; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1564 char *buffer; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1565 Py_ssize_t buffer_len, offset; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1566 |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1567 /* Validate arguments. +1 is for the first arg as buffer. */ |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1568 soself = (PyStructObject *)self; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1569 assert(PyStruct_Check(self)); |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1570 assert(soself->s_codes != NULL); |
|
38580
a114003aa3d3
Fixes in struct and socket from merge reviews.
Martin Blais <blais@furius.ca>
parents:
38530
diff
changeset
|
1571 if (PyTuple_GET_SIZE(args) != (soself->s_len + 2)) |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1572 { |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1573 PyErr_Format(StructError, |
|
38580
a114003aa3d3
Fixes in struct and socket from merge reviews.
Martin Blais <blais@furius.ca>
parents:
38530
diff
changeset
|
1574 "pack_into requires exactly %zd arguments", |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1575 (soself->s_len + 2)); |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1576 return NULL; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1577 } |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1578 |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1579 /* Extract a writable memory buffer from the first argument */ |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1580 if ( PyObject_AsWriteBuffer(PyTuple_GET_ITEM(args, 0), |
|
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1581 (void**)&buffer, &buffer_len) == -1 ) { |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1582 return NULL; |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1583 } |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1584 assert( buffer_len >= 0 ); |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1585 |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1586 /* Extract the offset from the first argument */ |
|
38580
a114003aa3d3
Fixes in struct and socket from merge reviews.
Martin Blais <blais@furius.ca>
parents:
38530
diff
changeset
|
1587 offset = PyInt_AsSsize_t(PyTuple_GET_ITEM(args, 1)); |
|
49351
6a73134f9603
Victor Stinner's patches to check the return result of PyLong_Ssize_t
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1588 if (offset == -1 && PyErr_Occurred()) |
|
6a73134f9603
Victor Stinner's patches to check the return result of PyLong_Ssize_t
Benjamin Peterson <benjamin@python.org>
parents:
47587
diff
changeset
|
1589 return NULL; |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1590 |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1591 /* Support negative offsets. */ |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1592 if (offset < 0) |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1593 offset += buffer_len; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1594 |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1595 /* Check boundaries */ |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1596 if (offset < 0 || (buffer_len - offset) < soself->s_size) { |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1597 PyErr_Format(StructError, |
|
38580
a114003aa3d3
Fixes in struct and socket from merge reviews.
Martin Blais <blais@furius.ca>
parents:
38530
diff
changeset
|
1598 "pack_into requires a buffer of at least %zd bytes", |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1599 soself->s_size); |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1600 return NULL; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1601 } |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1602 |
|
38353
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1603 /* Call the guts */ |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1604 if ( s_pack_internal(soself, args, 2, buffer + offset) != 0 ) { |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1605 return NULL; |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1606 } |
|
36cd4a4ab8f7
Support for buffer protocol for socket and struct.
Martin Blais <blais@furius.ca>
parents:
38322
diff
changeset
|
1607 |
|
38470
e0cea605417e
Fix ref-antileak in _struct.c which eventually lead to deallocating None.
Georg Brandl <georg@python.org>
parents:
38445
diff
changeset
|
1608 Py_RETURN_NONE; |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1609 } |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1610 |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1611 static PyObject * |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1612 s_get_format(PyStructObject *self, void *unused) |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1613 { |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1614 Py_INCREF(self->s_format); |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1615 return self->s_format; |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1616 } |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1617 |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1618 static PyObject * |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1619 s_get_size(PyStructObject *self, void *unused) |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1620 { |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1621 return PyInt_FromSsize_t(self->s_size); |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1622 } |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1623 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1624 /* List of functions */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1625 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1626 static struct PyMethodDef s_methods[] = { |
|
38580
a114003aa3d3
Fixes in struct and socket from merge reviews.
Martin Blais <blais@furius.ca>
parents:
38530
diff
changeset
|
1627 {"pack", s_pack, METH_VARARGS, s_pack__doc__}, |
|
a114003aa3d3
Fixes in struct and socket from merge reviews.
Martin Blais <blais@furius.ca>
parents:
38530
diff
changeset
|
1628 {"pack_into", s_pack_into, METH_VARARGS, s_pack_into__doc__}, |
|
a114003aa3d3
Fixes in struct and socket from merge reviews.
Martin Blais <blais@furius.ca>
parents:
38530
diff
changeset
|
1629 {"unpack", s_unpack, METH_O, s_unpack__doc__}, |
|
41816
ec83d21065aa
Stop using METH_OLDARGS implicitly
Neal Norwitz <nnorwitz@gmail.com>
parents:
41526
diff
changeset
|
1630 {"unpack_from", (PyCFunction)s_unpack_from, METH_VARARGS|METH_KEYWORDS, |
|
38583
e00e68dd1ddf
s_methods[]: Stop compiler warnings by casting
Tim Peters <tim.peters@gmail.com>
parents:
38580
diff
changeset
|
1631 s_unpack_from__doc__}, |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1632 {NULL, NULL} /* sentinel */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1633 }; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1634 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1635 PyDoc_STRVAR(s__doc__, "Compiled struct object"); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1636 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1637 #define OFF(x) offsetof(PyStructObject, x) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1638 |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1639 static PyGetSetDef s_getsetlist[] = { |
|
38430
795d1cb1df01
Fix up struct docstrings, add struct.pack_to function for symmetry
Bob Ippolito <bob@redivi.com>
parents:
38429
diff
changeset
|
1640 {"format", (getter)s_get_format, (setter)NULL, "struct format string", NULL}, |
|
795d1cb1df01
Fix up struct docstrings, add struct.pack_to function for symmetry
Bob Ippolito <bob@redivi.com>
parents:
38429
diff
changeset
|
1641 {"size", (getter)s_get_size, (setter)NULL, "struct size in bytes", NULL}, |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1642 {NULL} /* sentinel */ |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1643 }; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1644 |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1645 static |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1646 PyTypeObject PyStructType = { |
|
42333
6620a510e9a9
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
Martin v. Löwis <martin@v.loewis.de>
parents:
41816
diff
changeset
|
1647 PyVarObject_HEAD_INIT(NULL, 0) |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1648 "Struct", |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1649 sizeof(PyStructObject), |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1650 0, |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1651 (destructor)s_dealloc, /* tp_dealloc */ |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1652 0, /* tp_print */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1653 0, /* tp_getattr */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1654 0, /* tp_setattr */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1655 0, /* tp_compare */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1656 0, /* tp_repr */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1657 0, /* tp_as_number */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1658 0, /* tp_as_sequence */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1659 0, /* tp_as_mapping */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1660 0, /* tp_hash */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1661 0, /* tp_call */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1662 0, /* tp_str */ |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1663 PyObject_GenericGetAttr, /* tp_getattro */ |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1664 PyObject_GenericSetAttr, /* tp_setattro */ |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1665 0, /* tp_as_buffer */ |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1666 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS,/* tp_flags */ |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1667 s__doc__, /* tp_doc */ |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1668 0, /* tp_traverse */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1669 0, /* tp_clear */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1670 0, /* tp_richcompare */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1671 offsetof(PyStructObject, weakreflist), /* tp_weaklistoffset */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1672 0, /* tp_iter */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1673 0, /* tp_iternext */ |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1674 s_methods, /* tp_methods */ |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1675 NULL, /* tp_members */ |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1676 s_getsetlist, /* tp_getset */ |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1677 0, /* tp_base */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1678 0, /* tp_dict */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1679 0, /* tp_descr_get */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1680 0, /* tp_descr_set */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1681 0, /* tp_dictoffset */ |
|
38411
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1682 s_init, /* tp_init */ |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1683 PyType_GenericAlloc,/* tp_alloc */ |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1684 s_new, /* tp_new */ |
|
631b6648fdf4
enable all of the struct tests, use ssize_t, fix some whitespace
Bob Ippolito <bob@redivi.com>
parents:
38378
diff
changeset
|
1685 PyObject_Del, /* tp_free */ |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1686 }; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1687 |
|
44446
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1688 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1689 /* ---- Standalone functions ---- */ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1690 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1691 #define MAXCACHE 100 |
|
44459
7643a43f25a1
Added _struct._clearcache() for regression tests
Christian Heimes <christian@cheimes.de>
parents:
44446
diff
changeset
|
1692 static PyObject *cache = NULL; |
|
44446
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1693 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1694 static PyObject * |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1695 cache_struct(PyObject *fmt) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1696 { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1697 PyObject * s_object; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1698 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1699 if (cache == NULL) { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1700 cache = PyDict_New(); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1701 if (cache == NULL) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1702 return NULL; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1703 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1704 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1705 s_object = PyDict_GetItem(cache, fmt); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1706 if (s_object != NULL) { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1707 Py_INCREF(s_object); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1708 return s_object; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1709 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1710 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1711 s_object = PyObject_CallFunctionObjArgs((PyObject *)(&PyStructType), fmt, NULL); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1712 if (s_object != NULL) { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1713 if (PyDict_Size(cache) >= MAXCACHE) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1714 PyDict_Clear(cache); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1715 /* Attempt to cache the result */ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1716 if (PyDict_SetItem(cache, fmt, s_object) == -1) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1717 PyErr_Clear(); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1718 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1719 return s_object; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1720 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1721 |
|
44459
7643a43f25a1
Added _struct._clearcache() for regression tests
Christian Heimes <christian@cheimes.de>
parents:
44446
diff
changeset
|
1722 PyDoc_STRVAR(clearcache_doc, |
|
7643a43f25a1
Added _struct._clearcache() for regression tests
Christian Heimes <christian@cheimes.de>
parents:
44446
diff
changeset
|
1723 "Clear the internal cache."); |
|
7643a43f25a1
Added _struct._clearcache() for regression tests
Christian Heimes <christian@cheimes.de>
parents:
44446
diff
changeset
|
1724 |
|
7643a43f25a1
Added _struct._clearcache() for regression tests
Christian Heimes <christian@cheimes.de>
parents:
44446
diff
changeset
|
1725 static PyObject * |
|
7643a43f25a1
Added _struct._clearcache() for regression tests
Christian Heimes <christian@cheimes.de>
parents:
44446
diff
changeset
|
1726 clearcache(PyObject *self) |
|
7643a43f25a1
Added _struct._clearcache() for regression tests
Christian Heimes <christian@cheimes.de>
parents:
44446
diff
changeset
|
1727 { |
|
44733
85cf220f16d8
clearcache() needs to remove the dict as well as clear it.
Raymond Hettinger <python@rcn.com>
parents:
44459
diff
changeset
|
1728 Py_CLEAR(cache); |
|
44459
7643a43f25a1
Added _struct._clearcache() for regression tests
Christian Heimes <christian@cheimes.de>
parents:
44446
diff
changeset
|
1729 Py_RETURN_NONE; |
|
7643a43f25a1
Added _struct._clearcache() for regression tests
Christian Heimes <christian@cheimes.de>
parents:
44446
diff
changeset
|
1730 } |
|
7643a43f25a1
Added _struct._clearcache() for regression tests
Christian Heimes <christian@cheimes.de>
parents:
44446
diff
changeset
|
1731 |
|
44446
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1732 PyDoc_STRVAR(calcsize_doc, |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1733 "Return size of C struct described by format string fmt."); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1734 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1735 static PyObject * |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1736 calcsize(PyObject *self, PyObject *fmt) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1737 { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1738 Py_ssize_t n; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1739 PyObject *s_object = cache_struct(fmt); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1740 if (s_object == NULL) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1741 return NULL; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1742 n = ((PyStructObject *)s_object)->s_size; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1743 Py_DECREF(s_object); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1744 return PyInt_FromSsize_t(n); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1745 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1746 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1747 PyDoc_STRVAR(pack_doc, |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1748 "Return string containing values v1, v2, ... packed according to fmt."); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1749 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1750 static PyObject * |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1751 pack(PyObject *self, PyObject *args) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1752 { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1753 PyObject *s_object, *fmt, *newargs, *result; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1754 Py_ssize_t n = PyTuple_GET_SIZE(args); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1755 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1756 if (n == 0) { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1757 PyErr_SetString(PyExc_TypeError, "missing format argument"); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1758 return NULL; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1759 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1760 fmt = PyTuple_GET_ITEM(args, 0); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1761 newargs = PyTuple_GetSlice(args, 1, n); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1762 if (newargs == NULL) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1763 return NULL; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1764 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1765 s_object = cache_struct(fmt); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1766 if (s_object == NULL) { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1767 Py_DECREF(newargs); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1768 return NULL; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1769 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1770 result = s_pack(s_object, newargs); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1771 Py_DECREF(newargs); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1772 Py_DECREF(s_object); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1773 return result; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1774 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1775 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1776 PyDoc_STRVAR(pack_into_doc, |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1777 "Pack the values v1, v2, ... according to fmt.\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1778 Write the packed bytes into the writable buffer buf starting at offset."); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1779 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1780 static PyObject * |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1781 pack_into(PyObject *self, PyObject *args) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1782 { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1783 PyObject *s_object, *fmt, *newargs, *result; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1784 Py_ssize_t n = PyTuple_GET_SIZE(args); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1785 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1786 if (n == 0) { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1787 PyErr_SetString(PyExc_TypeError, "missing format argument"); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1788 return NULL; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1789 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1790 fmt = PyTuple_GET_ITEM(args, 0); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1791 newargs = PyTuple_GetSlice(args, 1, n); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1792 if (newargs == NULL) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1793 return NULL; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1794 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1795 s_object = cache_struct(fmt); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1796 if (s_object == NULL) { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1797 Py_DECREF(newargs); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1798 return NULL; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1799 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1800 result = s_pack_into(s_object, newargs); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1801 Py_DECREF(newargs); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1802 Py_DECREF(s_object); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1803 return result; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1804 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1805 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1806 PyDoc_STRVAR(unpack_doc, |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1807 "Unpack the string containing packed C structure data, according to fmt.\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1808 Requires len(string) == calcsize(fmt)."); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1809 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1810 static PyObject * |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1811 unpack(PyObject *self, PyObject *args) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1812 { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1813 PyObject *s_object, *fmt, *inputstr, *result; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1814 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1815 if (!PyArg_UnpackTuple(args, "unpack", 2, 2, &fmt, &inputstr)) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1816 return NULL; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1817 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1818 s_object = cache_struct(fmt); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1819 if (s_object == NULL) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1820 return NULL; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1821 result = s_unpack(s_object, inputstr); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1822 Py_DECREF(s_object); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1823 return result; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1824 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1825 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1826 PyDoc_STRVAR(unpack_from_doc, |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1827 "Unpack the buffer, containing packed C structure data, according to\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1828 fmt, starting at offset. Requires len(buffer[offset:]) >= calcsize(fmt)."); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1829 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1830 static PyObject * |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1831 unpack_from(PyObject *self, PyObject *args, PyObject *kwds) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1832 { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1833 PyObject *s_object, *fmt, *newargs, *result; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1834 Py_ssize_t n = PyTuple_GET_SIZE(args); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1835 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1836 if (n == 0) { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1837 PyErr_SetString(PyExc_TypeError, "missing format argument"); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1838 return NULL; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1839 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1840 fmt = PyTuple_GET_ITEM(args, 0); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1841 newargs = PyTuple_GetSlice(args, 1, n); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1842 if (newargs == NULL) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1843 return NULL; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1844 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1845 s_object = cache_struct(fmt); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1846 if (s_object == NULL) { |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1847 Py_DECREF(newargs); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1848 return NULL; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1849 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1850 result = s_unpack_from(s_object, newargs, kwds); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1851 Py_DECREF(newargs); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1852 Py_DECREF(s_object); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1853 return result; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1854 } |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1855 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1856 static struct PyMethodDef module_functions[] = { |
|
44459
7643a43f25a1
Added _struct._clearcache() for regression tests
Christian Heimes <christian@cheimes.de>
parents:
44446
diff
changeset
|
1857 {"_clearcache", (PyCFunction)clearcache, METH_NOARGS, clearcache_doc}, |
|
44446
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1858 {"calcsize", calcsize, METH_O, calcsize_doc}, |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1859 {"pack", pack, METH_VARARGS, pack_doc}, |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1860 {"pack_into", pack_into, METH_VARARGS, pack_into_doc}, |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1861 {"unpack", unpack, METH_VARARGS, unpack_doc}, |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1862 {"unpack_from", (PyCFunction)unpack_from, |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1863 METH_VARARGS|METH_KEYWORDS, unpack_from_doc}, |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1864 {NULL, NULL} /* sentinel */ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1865 }; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1866 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1867 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1868 /* Module initialization */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1869 |
|
44446
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1870 PyDoc_STRVAR(module_doc, |
|
56416
e759ca25701d
Issue #7078: _struct.__doc__ was being ignored. Import it into struct.
Mark Dickinson <dickinsm@gmail.com>
parents:
56246
diff
changeset
|
1871 "Functions to convert between Python values and C structs represented\n\ |
|
e759ca25701d
Issue #7078: _struct.__doc__ was being ignored. Import it into struct.
Mark Dickinson <dickinsm@gmail.com>
parents:
56246
diff
changeset
|
1872 as Python strings. It uses format strings (explained below) as compact\n\ |
|
e759ca25701d
Issue #7078: _struct.__doc__ was being ignored. Import it into struct.
Mark Dickinson <dickinsm@gmail.com>
parents:
56246
diff
changeset
|
1873 descriptions of the lay-out of the C structs and the intended conversion\n\ |
|
e759ca25701d
Issue #7078: _struct.__doc__ was being ignored. Import it into struct.
Mark Dickinson <dickinsm@gmail.com>
parents:
56246
diff
changeset
|
1874 to/from Python values.\n\ |
|
44446
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1875 \n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1876 The optional first format char indicates byte order, size and alignment:\n\ |
|
56416
e759ca25701d
Issue #7078: _struct.__doc__ was being ignored. Import it into struct.
Mark Dickinson <dickinsm@gmail.com>
parents:
56246
diff
changeset
|
1877 @: native order, size & alignment (default)\n\ |
|
e759ca25701d
Issue #7078: _struct.__doc__ was being ignored. Import it into struct.
Mark Dickinson <dickinsm@gmail.com>
parents:
56246
diff
changeset
|
1878 =: native order, std. size & alignment\n\ |
|
e759ca25701d
Issue #7078: _struct.__doc__ was being ignored. Import it into struct.
Mark Dickinson <dickinsm@gmail.com>
parents:
56246
diff
changeset
|
1879 <: little-endian, std. size & alignment\n\ |
|
e759ca25701d
Issue #7078: _struct.__doc__ was being ignored. Import it into struct.
Mark Dickinson <dickinsm@gmail.com>
parents:
56246
diff
changeset
|
1880 >: big-endian, std. size & alignment\n\ |
|
e759ca25701d
Issue #7078: _struct.__doc__ was being ignored. Import it into struct.
Mark Dickinson <dickinsm@gmail.com>
parents:
56246
diff
changeset
|
1881 !: same as >\n\ |
|
44446
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1882 \n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1883 The remaining chars indicate types of args and must match exactly;\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1884 these can be preceded by a decimal repeat count:\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1885 x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;\n\ |
|
56416
e759ca25701d
Issue #7078: _struct.__doc__ was being ignored. Import it into struct.
Mark Dickinson <dickinsm@gmail.com>
parents:
56246
diff
changeset
|
1886 ?: _Bool (requires C99; if not available, char is used instead)\n\ |
|
44446
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1887 h:short; H:unsigned short; i:int; I:unsigned int;\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1888 l:long; L:unsigned long; f:float; d:double.\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1889 Special cases (preceding decimal count indicates length):\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1890 s:string (array of char); p: pascal string (with count byte).\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1891 Special case (only available in native format):\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1892 P:an integer type that is wide enough to hold a pointer.\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1893 Special case (not in native mode unless 'long long' in platform C):\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1894 q:long long; Q:unsigned long long\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1895 Whitespace between formats is ignored.\n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1896 \n\ |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1897 The variable struct.error is an exception raised on errors.\n"); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1898 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1899 PyMODINIT_FUNC |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1900 init_struct(void) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1901 { |
|
44446
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1902 PyObject *ver, *m; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1903 |
|
47527
52294af4b663
This reverts r63675 based on the discussion in this thread:
Gregory P. Smith <greg@mad-scientist.com>
parents:
47294
diff
changeset
|
1904 ver = PyString_FromString("0.2"); |
|
44446
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1905 if (ver == NULL) |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1906 return; |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1907 |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1908 m = Py_InitModule3("_struct", module_functions, module_doc); |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1909 if (m == NULL) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1910 return; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1911 |
|
44350
26384b8180c7
#1629: Renamed Py_Size, Py_Type and Py_Refcnt to Py_SIZE, Py_TYPE and Py_REFCNT. Macros for b/w compatibility are available.
Christian Heimes <christian@cheimes.de>
parents:
42333
diff
changeset
|
1912 Py_TYPE(&PyStructType) = &PyType_Type; |
| 38312 | 1913 if (PyType_Ready(&PyStructType) < 0) |
| 1914 return; | |
| 1915 | |
|
55153
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1916 /* This speed trick can't be used until overflow masking goes |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1917 away, because native endian always raises exceptions |
|
b3fb5e6b7e82
Issue #1523: Remove deprecated overflow masking in struct module, and
Mark Dickinson <dickinsm@gmail.com>
parents:
55142
diff
changeset
|
1918 instead of overflow masking. */ |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1919 |
|
38317
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1920 /* Check endian and swap in faster functions */ |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1921 { |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1922 int one = 1; |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1923 formatdef *native = native_table; |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1924 formatdef *other, *ptr; |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1925 if ((int)*(unsigned char*)&one) |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1926 other = lilendian_table; |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1927 else |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1928 other = bigendian_table; |
|
38322
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1929 /* Scan through the native table, find a matching |
|
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1930 entry in the endian table and swap in the |
|
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1931 native implementations whenever possible |
|
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1932 (64-bit platforms may not have "standard" sizes) */ |
|
38317
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1933 while (native->format != '\0' && other->format != '\0') { |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1934 ptr = other; |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1935 while (ptr->format != '\0') { |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1936 if (ptr->format == native->format) { |
|
38322
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1937 /* Match faster when formats are |
|
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1938 listed in the same order */ |
|
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1939 if (ptr == other) |
|
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1940 other++; |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1941 /* Only use the trick if the |
|
38322
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1942 size matches */ |
|
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1943 if (ptr->size != native->size) |
|
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1944 break; |
|
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1945 /* Skip float and double, could be |
|
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1946 "unknown" float format */ |
|
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1947 if (ptr->format == 'd' || ptr->format == 'f') |
|
c77da2736fb2
fix test_float regression and 64-bit size mismatch issue
Bob Ippolito <bob@redivi.com>
parents:
38317
diff
changeset
|
1948 break; |
|
38317
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1949 ptr->pack = native->pack; |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1950 ptr->unpack = native->unpack; |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1951 break; |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1952 } |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1953 ptr++; |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1954 } |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1955 native++; |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1956 } |
|
68a348c9868d
Use faster struct pack/unpack functions for the endian table that matches the host's
Bob Ippolito <bob@redivi.com>
parents:
38316
diff
changeset
|
1957 } |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1958 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1959 /* Add some symbolic constants to the module */ |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1960 if (StructError == NULL) { |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1961 StructError = PyErr_NewException("struct.error", NULL, NULL); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1962 if (StructError == NULL) |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1963 return; |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1964 } |
|
38316
2f16e2715223
Use LONG_MIN and LONG_MAX to check Python integer bounds instead of the incorrect INT_MIN and INT_MAX
Bob Ippolito <bob@redivi.com>
parents:
38313
diff
changeset
|
1965 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1966 Py_INCREF(StructError); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1967 PyModule_AddObject(m, "error", StructError); |
|
38316
2f16e2715223
Use LONG_MIN and LONG_MAX to check Python integer bounds instead of the incorrect INT_MIN and INT_MAX
Bob Ippolito <bob@redivi.com>
parents:
38313
diff
changeset
|
1968 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1969 Py_INCREF((PyObject*)&PyStructType); |
|
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1970 PyModule_AddObject(m, "Struct", (PyObject*)&PyStructType); |
|
38528
e0997ffa3572
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
38520
diff
changeset
|
1971 |
|
44446
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1972 PyModule_AddObject(m, "__version__", ver); |
|
8d69edd3d290
Finish-up the struct module optimizations started at the Iceland NFS sprint.
Raymond Hettinger <python@rcn.com>
parents:
44350
diff
changeset
|
1973 |
|
38493
7d510e4f3c98
struct: modulo math plus warning on all endian-explicit formats for compatibility with older struct usage (ugly)
Bob Ippolito <bob@redivi.com>
parents:
38484
diff
changeset
|
1974 PyModule_AddIntConstant(m, "_PY_STRUCT_RANGE_CHECKING", 1); |
|
39380
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
1975 #ifdef PY_STRUCT_FLOAT_COERCE |
|
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
1976 PyModule_AddIntConstant(m, "_PY_STRUCT_FLOAT_COERCE", 1); |
|
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
1977 #endif |
|
9cb4565e60ca
Fix #1530559, struct.pack raises TypeError where it used to convert.
Bob Ippolito <bob@redivi.com>
parents:
39301
diff
changeset
|
1978 |
|
38259
895da42480f1
Patch #1493701: performance enhancements for struct module.
Bob Ippolito <bob@redivi.com>
parents:
diff
changeset
|
1979 } |
