Mercurial > cpython-lru_cache-weakref
annotate Python/marshal.c @ 73323:dad02a080bbc
Improve byte-compilation in packaging to be independent of -O or -B.
The code I fixed to comply with PEP 3147 still had one bug: When run
under python -O, some paths for pyc files would be pyo, because I called
imp.cache_from_source without explicit debug_override argument in some
places, and under -O that would return .pyo (this is well explained in
the imp docs). Now all code (util.byte_compile, build_py, install_lib)
can create .pyo files according to options given by users,
without interference from the calling Python’s own optimize mode.
On a related topic, I also removed the code that prevented byte
compilation under python -B. The rationale is that packaging gives
control over the creation of pyc files to the user with its own explicit
option, and the behavior should not be changed if the calling Python
happens to run with -B for whatever reason. I will argue that this is a
bug fix and ask to be allowed to backport this change to distutils.
Finally, I moved one nugget of information about the --compile and
--optimize options from the source into the doc. It clears up a
misunderstanding that I (and maybe other people) had.
| author | Éric Araujo <merwok@netwok.org> |
|---|---|
| date | Thu, 03 Nov 2011 05:08:28 +0100 |
| parents | 7109f31300fb |
| children | b1303cf15e01 |
| rev | line source |
|---|---|
| 267 | 1 |
| 2 /* Write Python objects to files and read them back. | |
| 3 This is intended for writing and reading compiled Python code only; | |
| 4 a true persistent storage facility would be much harder, since | |
| 5 it would have to take circular links and sharing into account. */ | |
| 6 | |
|
36792
688795873ff1
Make Py_ssize_t clean.
Thomas Wouters <thomas@python.org>
parents:
36784
diff
changeset
|
7 #define PY_SSIZE_T_CLEAN |
|
688795873ff1
Make Py_ssize_t clean.
Thomas Wouters <thomas@python.org>
parents:
36784
diff
changeset
|
8 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
9 #include "Python.h" |
| 267 | 10 #include "longintrepr.h" |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35346
diff
changeset
|
11 #include "code.h" |
| 267 | 12 #include "marshal.h" |
| 13 | |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
14 #define ABS(x) ((x) < 0 ? -(x) : (x)) |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
15 |
|
13070
7392e71f6cce
Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
16 /* High water mark to determine when the marshalled object is dangerously deep |
|
7392e71f6cce
Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
17 * and risks coring the interpreter. When the object stack gets this deep, |
|
7392e71f6cce
Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
18 * raise an exception instead of continuing. |
|
43007
5fde5d6964d7
[Oops, I forgot half of the patch.]
Guido van Rossum <guido@python.org>
parents:
42665
diff
changeset
|
19 * On Windows debug builds, reduce this value. |
|
13070
7392e71f6cce
Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
20 */ |
|
43007
5fde5d6964d7
[Oops, I forgot half of the patch.]
Guido van Rossum <guido@python.org>
parents:
42665
diff
changeset
|
21 #if defined(MS_WINDOWS) && defined(_DEBUG) |
|
5fde5d6964d7
[Oops, I forgot half of the patch.]
Guido van Rossum <guido@python.org>
parents:
42665
diff
changeset
|
22 #define MAX_MARSHAL_STACK_DEPTH 1500 |
|
5fde5d6964d7
[Oops, I forgot half of the patch.]
Guido van Rossum <guido@python.org>
parents:
42665
diff
changeset
|
23 #else |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41715
diff
changeset
|
24 #define MAX_MARSHAL_STACK_DEPTH 2000 |
|
43007
5fde5d6964d7
[Oops, I forgot half of the patch.]
Guido van Rossum <guido@python.org>
parents:
42665
diff
changeset
|
25 #endif |
|
13070
7392e71f6cce
Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
26 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
27 #define TYPE_NULL '0' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
28 #define TYPE_NONE 'N' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
29 #define TYPE_FALSE 'F' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
30 #define TYPE_TRUE 'T' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
31 #define TYPE_STOPITER 'S' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
32 #define TYPE_ELLIPSIS '.' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
33 #define TYPE_INT 'i' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
34 #define TYPE_INT64 'I' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
35 #define TYPE_FLOAT 'f' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
36 #define TYPE_BINARY_FLOAT 'g' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
37 #define TYPE_COMPLEX 'x' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
38 #define TYPE_BINARY_COMPLEX 'y' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
39 #define TYPE_LONG 'l' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
40 #define TYPE_STRING 's' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
41 #define TYPE_TUPLE '(' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
42 #define TYPE_LIST '[' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
43 #define TYPE_DICT '{' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
44 #define TYPE_CODE 'c' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
45 #define TYPE_UNICODE 'u' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
46 #define TYPE_UNKNOWN '?' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
47 #define TYPE_SET '<' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
48 #define TYPE_FROZENSET '>' |
| 267 | 49 |
|
53300
ed3f51f2abfb
Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents:
53192
diff
changeset
|
50 #define WFERR_OK 0 |
|
ed3f51f2abfb
Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents:
53192
diff
changeset
|
51 #define WFERR_UNMARSHALLABLE 1 |
|
ed3f51f2abfb
Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents:
53192
diff
changeset
|
52 #define WFERR_NESTEDTOODEEP 2 |
|
ed3f51f2abfb
Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents:
53192
diff
changeset
|
53 #define WFERR_NOMEMORY 3 |
|
ed3f51f2abfb
Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents:
53192
diff
changeset
|
54 |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
55 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
56 FILE *fp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
57 int error; /* see WFERR_* values */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
58 int depth; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
59 /* If fp == NULL, the following are valid: */ |
|
71554
9e293f617544
Fix style in code added by edba722f3b02
Éric Araujo <merwok@netwok.org>
parents:
71134
diff
changeset
|
60 PyObject *readable; /* Stream-like object being read from */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
61 PyObject *str; |
|
70435
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
62 PyObject *current_filename; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
63 char *ptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
64 char *end; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
65 int version; |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
66 } WFILE; |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
67 |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
68 #define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
69 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
70 else w_more(c, p) |
| 267 | 71 |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
72 static void |
|
13672
bfc5b2a8c11f
-- changed w_more to take an integer instead of a char
Fredrik Lundh <fredrik@pythonware.com>
parents:
13658
diff
changeset
|
73 w_more(int c, WFILE *p) |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
74 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
75 Py_ssize_t size, newsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
76 if (p->str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
77 return; /* An error already occurred */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
78 size = PyBytes_Size(p->str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
79 newsize = size + size + 1024; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
80 if (newsize > 32*1024*1024) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
81 newsize = size + (size >> 3); /* 12.5% overallocation */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
82 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
83 if (_PyBytes_Resize(&p->str, newsize) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
84 p->ptr = p->end = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
85 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
86 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
87 p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
88 p->end = |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
89 PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
90 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
91 } |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
92 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
93 |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
94 static void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
95 w_string(char *s, int n, WFILE *p) |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
96 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
97 if (p->fp != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
98 fwrite(s, 1, n, p->fp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
99 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
100 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
101 while (--n >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
102 w_byte(*s, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
103 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
104 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
105 } |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
106 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
107 |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
108 static void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
109 w_short(int x, WFILE *p) |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
110 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
111 w_byte((char)( x & 0xff), p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
112 w_byte((char)((x>> 8) & 0xff), p); |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
113 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
114 |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
115 static void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
116 w_long(long x, WFILE *p) |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
117 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
118 w_byte((char)( x & 0xff), p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
119 w_byte((char)((x>> 8) & 0xff), p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
120 w_byte((char)((x>>16) & 0xff), p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
121 w_byte((char)((x>>24) & 0xff), p); |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
122 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
123 |
|
4656
186c2ad4abf3
Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4592
diff
changeset
|
124 #if SIZEOF_LONG > 4 |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
125 static void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
126 w_long64(long x, WFILE *p) |
|
4592
3bf9e2beaf8c
Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
127 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
128 w_long(x, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
129 w_long(x>>32, p); |
|
4592
3bf9e2beaf8c
Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
130 } |
|
4656
186c2ad4abf3
Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4592
diff
changeset
|
131 #endif |
|
4592
3bf9e2beaf8c
Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
132 |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
133 /* We assume that Python longs are stored internally in base some power of |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
134 2**15; for the sake of portability we'll always read and write them in base |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
135 exactly 2**15. */ |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
136 |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
137 #define PyLong_MARSHAL_SHIFT 15 |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
138 #define PyLong_MARSHAL_BASE ((short)1 << PyLong_MARSHAL_SHIFT) |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
139 #define PyLong_MARSHAL_MASK (PyLong_MARSHAL_BASE - 1) |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
140 #if PyLong_SHIFT % PyLong_MARSHAL_SHIFT != 0 |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
141 #error "PyLong_SHIFT must be a multiple of PyLong_MARSHAL_SHIFT" |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
142 #endif |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
143 #define PyLong_MARSHAL_RATIO (PyLong_SHIFT / PyLong_MARSHAL_SHIFT) |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
144 |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
145 static void |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
146 w_PyLong(const PyLongObject *ob, WFILE *p) |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
147 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
148 Py_ssize_t i, j, n, l; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
149 digit d; |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
150 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
151 w_byte(TYPE_LONG, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
152 if (Py_SIZE(ob) == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
153 w_long((long)0, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
154 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
155 } |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
156 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
157 /* set l to number of base PyLong_MARSHAL_BASE digits */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
158 n = ABS(Py_SIZE(ob)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
159 l = (n-1) * PyLong_MARSHAL_RATIO; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
160 d = ob->ob_digit[n-1]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
161 assert(d != 0); /* a PyLong is always normalized */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
162 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
163 d >>= PyLong_MARSHAL_SHIFT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
164 l++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
165 } while (d != 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
166 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p); |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
167 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
168 for (i=0; i < n-1; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
169 d = ob->ob_digit[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
170 for (j=0; j < PyLong_MARSHAL_RATIO; j++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
171 w_short(d & PyLong_MARSHAL_MASK, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
172 d >>= PyLong_MARSHAL_SHIFT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
173 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
174 assert (d == 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
175 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
176 d = ob->ob_digit[n-1]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
177 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
178 w_short(d & PyLong_MARSHAL_MASK, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
179 d >>= PyLong_MARSHAL_SHIFT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
180 } while (d != 0); |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
181 } |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
182 |
|
4592
3bf9e2beaf8c
Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
183 static void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
184 w_object(PyObject *v, WFILE *p) |
| 267 | 185 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
186 Py_ssize_t i, n; |
|
13070
7392e71f6cce
Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
187 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
188 p->depth++; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
189 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
190 if (p->depth > MAX_MARSHAL_STACK_DEPTH) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
191 p->error = WFERR_NESTEDTOODEEP; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
192 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
193 else if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
194 w_byte(TYPE_NULL, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
195 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
196 else if (v == Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
197 w_byte(TYPE_NONE, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
198 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
199 else if (v == PyExc_StopIteration) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
200 w_byte(TYPE_STOPITER, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
201 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
202 else if (v == Py_Ellipsis) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
203 w_byte(TYPE_ELLIPSIS, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
204 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
205 else if (v == Py_False) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
206 w_byte(TYPE_FALSE, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
207 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
208 else if (v == Py_True) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
209 w_byte(TYPE_TRUE, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
210 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
211 else if (PyLong_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
212 long x = PyLong_AsLong(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
213 if ((x == -1) && PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
214 PyLongObject *ob = (PyLongObject *)v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
215 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
216 w_PyLong(ob, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
217 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
218 else { |
|
4656
186c2ad4abf3
Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4592
diff
changeset
|
219 #if SIZEOF_LONG > 4 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
220 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
221 if (y && y != -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
222 w_byte(TYPE_INT64, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
223 w_long64(x, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
224 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
225 else |
|
4656
186c2ad4abf3
Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4592
diff
changeset
|
226 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
227 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
228 w_byte(TYPE_INT, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
229 w_long(x, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
230 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
231 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
232 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
233 else if (PyFloat_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
234 if (p->version > 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
235 unsigned char buf[8]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
236 if (_PyFloat_Pack8(PyFloat_AsDouble(v), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
237 buf, 1) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
238 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
239 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
240 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
241 w_byte(TYPE_BINARY_FLOAT, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
242 w_string((char*)buf, 8, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
243 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
244 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
245 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
246 'g', 17, 0, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
247 if (!buf) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
248 p->error = WFERR_NOMEMORY; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
249 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
250 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
251 n = strlen(buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
252 w_byte(TYPE_FLOAT, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
253 w_byte((int)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
254 w_string(buf, (int)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
255 PyMem_Free(buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
256 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
257 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
258 else if (PyComplex_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
259 if (p->version > 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
260 unsigned char buf[8]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
261 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
262 buf, 1) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
263 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
264 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
265 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
266 w_byte(TYPE_BINARY_COMPLEX, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
267 w_string((char*)buf, 8, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
268 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
269 buf, 1) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
270 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
271 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
272 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
273 w_string((char*)buf, 8, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
274 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
275 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
276 char *buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
277 w_byte(TYPE_COMPLEX, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
278 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
279 'g', 17, 0, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
280 if (!buf) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
281 p->error = WFERR_NOMEMORY; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
282 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
283 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
284 n = strlen(buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
285 w_byte((int)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
286 w_string(buf, (int)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
287 PyMem_Free(buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
288 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
289 'g', 17, 0, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
290 if (!buf) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
291 p->error = WFERR_NOMEMORY; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
292 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
293 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
294 n = strlen(buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
295 w_byte((int)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
296 w_string(buf, (int)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
297 PyMem_Free(buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
298 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
299 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
300 else if (PyBytes_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
301 w_byte(TYPE_STRING, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
302 n = PyBytes_GET_SIZE(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
303 if (n > INT_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
304 /* huge strings are not supported */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
305 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
306 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
307 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
308 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
309 w_long((long)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
310 w_string(PyBytes_AS_STRING(v), (int)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
311 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
312 else if (PyUnicode_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
313 PyObject *utf8; |
| 72475 | 314 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
315 if (utf8 == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
316 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
317 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
318 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
319 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
320 w_byte(TYPE_UNICODE, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
321 n = PyBytes_GET_SIZE(utf8); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
322 if (n > INT_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
323 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
324 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
325 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
326 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
327 w_long((long)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
328 w_string(PyBytes_AS_STRING(utf8), (int)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
329 Py_DECREF(utf8); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
330 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
331 else if (PyTuple_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
332 w_byte(TYPE_TUPLE, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
333 n = PyTuple_Size(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
334 w_long((long)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
335 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
336 w_object(PyTuple_GET_ITEM(v, i), p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
337 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
338 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
339 else if (PyList_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
340 w_byte(TYPE_LIST, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
341 n = PyList_GET_SIZE(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
342 w_long((long)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
343 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
344 w_object(PyList_GET_ITEM(v, i), p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
345 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
346 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
347 else if (PyDict_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
348 Py_ssize_t pos; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
349 PyObject *key, *value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
350 w_byte(TYPE_DICT, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
351 /* This one is NULL object terminated! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
352 pos = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
353 while (PyDict_Next(v, &pos, &key, &value)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
354 w_object(key, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
355 w_object(value, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
356 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
357 w_object((PyObject *)NULL, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
358 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
359 else if (PyAnySet_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
360 PyObject *value, *it; |
|
34394
b480abaf1f6f
SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents:
34205
diff
changeset
|
361 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
362 if (PyObject_TypeCheck(v, &PySet_Type)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
363 w_byte(TYPE_SET, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
364 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
365 w_byte(TYPE_FROZENSET, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
366 n = PyObject_Size(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
367 if (n == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
368 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
369 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
370 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
371 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
372 w_long((long)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
373 it = PyObject_GetIter(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
374 if (it == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
375 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
376 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
377 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
378 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
379 while ((value = PyIter_Next(it)) != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
380 w_object(value, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
381 Py_DECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
382 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
383 Py_DECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
384 if (PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
385 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
386 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
387 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
388 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
389 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
390 else if (PyCode_Check(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
391 PyCodeObject *co = (PyCodeObject *)v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
392 w_byte(TYPE_CODE, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
393 w_long(co->co_argcount, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
394 w_long(co->co_kwonlyargcount, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
395 w_long(co->co_nlocals, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
396 w_long(co->co_stacksize, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
397 w_long(co->co_flags, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
398 w_object(co->co_code, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
399 w_object(co->co_consts, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
400 w_object(co->co_names, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
401 w_object(co->co_varnames, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
402 w_object(co->co_freevars, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
403 w_object(co->co_cellvars, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
404 w_object(co->co_filename, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
405 w_object(co->co_name, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
406 w_long(co->co_firstlineno, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
407 w_object(co->co_lnotab, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
408 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
409 else if (PyObject_CheckBuffer(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
410 /* Write unknown buffer-style objects as a string */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
411 char *s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
412 PyBufferProcs *pb = v->ob_type->tp_as_buffer; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
413 Py_buffer view; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
414 if ((*pb->bf_getbuffer)(v, &view, PyBUF_SIMPLE) != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
415 w_byte(TYPE_UNKNOWN, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
416 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
417 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
418 w_byte(TYPE_STRING, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
419 n = view.len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
420 s = view.buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
421 if (n > INT_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
422 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
423 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
424 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
425 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
426 w_long((long)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
427 w_string(s, (int)n, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
428 if (pb->bf_releasebuffer != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
429 (*pb->bf_releasebuffer)(v, &view); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
430 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
431 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
432 w_byte(TYPE_UNKNOWN, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
433 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
434 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
435 p->depth--; |
| 267 | 436 } |
| 437 | |
|
32422
3df36e2e5ddc
Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents:
32343
diff
changeset
|
438 /* version currently has no effect for writing longs. */ |
| 267 | 439 void |
|
32422
3df36e2e5ddc
Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents:
32343
diff
changeset
|
440 PyMarshal_WriteLongToFile(long x, FILE *fp, int version) |
| 267 | 441 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
442 WFILE wf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
443 wf.fp = fp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
444 wf.error = WFERR_OK; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
445 wf.depth = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
446 wf.version = version; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
447 w_long(x, &wf); |
| 267 | 448 } |
| 449 | |
| 450 void | |
|
32422
3df36e2e5ddc
Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents:
32343
diff
changeset
|
451 PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version) |
| 267 | 452 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
453 WFILE wf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
454 wf.fp = fp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
455 wf.error = WFERR_OK; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
456 wf.depth = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
457 wf.version = version; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
458 w_object(x, &wf); |
| 267 | 459 } |
| 460 | |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
461 typedef WFILE RFILE; /* Same struct with different invariants */ |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
462 |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41715
diff
changeset
|
463 #define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF) |
|
2503
4dd1af0ddef0
various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents:
2368
diff
changeset
|
464 |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
465 static int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
466 r_string(char *s, int n, RFILE *p) |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
467 { |
|
71554
9e293f617544
Fix style in code added by edba722f3b02
Éric Araujo <merwok@netwok.org>
parents:
71134
diff
changeset
|
468 char *ptr; |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
469 int read, left; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
470 |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
471 if (!p->readable) { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
472 if (p->fp != NULL) |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
473 /* The result fits into int because it must be <=n. */ |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
474 read = (int) fread(s, 1, n, p->fp); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
475 else { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
476 left = (int)(p->end - p->ptr); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
477 read = (left < n) ? left : n; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
478 memcpy(s, p->ptr, read); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
479 p->ptr += read; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
480 } |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
481 } |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
482 else { |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
483 _Py_IDENTIFIER(read); |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
484 |
|
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
485 PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "i", n); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
486 read = 0; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
487 if (data != NULL) { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
488 if (!PyBytes_Check(data)) { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
489 PyErr_Format(PyExc_TypeError, |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
490 "f.read() returned not bytes but %.100s", |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
491 data->ob_type->tp_name); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
492 } |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
493 else { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
494 read = PyBytes_GET_SIZE(data); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
495 if (read > 0) { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
496 ptr = PyBytes_AS_STRING(data); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
497 memcpy(s, ptr, read); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
498 } |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
499 } |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
500 Py_DECREF(data); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
501 } |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
502 } |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
503 if (!PyErr_Occurred() && (read < n)) { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
504 PyErr_SetString(PyExc_EOFError, "EOF read where not expected"); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
505 } |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
506 return read; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
507 } |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
508 |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
509 |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
510 static int |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
511 r_byte(RFILE *p) |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
512 { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
513 int c = EOF; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
514 unsigned char ch; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
515 int n; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
516 |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
517 if (!p->readable) |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
518 c = p->fp ? getc(p->fp) : rs_byte(p); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
519 else { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
520 n = r_string((char *) &ch, 1, p); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
521 if (n > 0) |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
522 c = ch; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
523 } |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
524 return c; |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
525 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
526 |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
527 static int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
528 r_short(RFILE *p) |
| 267 | 529 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
530 register short x; |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
531 unsigned char buffer[2]; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
532 |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
533 r_string((char *) buffer, 2, p); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
534 x = buffer[0]; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
535 x |= buffer[1] << 8; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
536 /* Sign-extension, in case short greater than 16 bits */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
537 x |= -(x & 0x8000); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
538 return x; |
| 267 | 539 } |
| 540 | |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
541 static long |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
542 r_long(RFILE *p) |
| 267 | 543 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
544 register long x; |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
545 unsigned char buffer[4]; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
546 |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
547 r_string((char *) buffer, 4, p); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
548 x = buffer[0]; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
549 x |= (long)buffer[1] << 8; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
550 x |= (long)buffer[2] << 16; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
551 x |= (long)buffer[3] << 24; |
|
4656
186c2ad4abf3
Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4592
diff
changeset
|
552 #if SIZEOF_LONG > 4 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
553 /* Sign extension for 64-bit machines */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
554 x |= -(x & 0x80000000L); |
|
4656
186c2ad4abf3
Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4592
diff
changeset
|
555 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
556 return x; |
|
4592
3bf9e2beaf8c
Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
557 } |
|
3bf9e2beaf8c
Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
558 |
|
19547
7e628f60245e
marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
559 /* r_long64 deals with the TYPE_INT64 code. On a machine with |
|
7e628f60245e
marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
560 sizeof(long) > 4, it returns a Python int object, else a Python long |
|
7e628f60245e
marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
561 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough, |
|
7e628f60245e
marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
562 so there's no inefficiency here in returning a PyLong on 32-bit boxes |
|
7e628f60245e
marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
563 for everything written via TYPE_INT64 (i.e., if an int is written via |
|
7e628f60245e
marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
564 TYPE_INT64, it *needs* more than 32 bits). |
|
7e628f60245e
marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
565 */ |
|
7e628f60245e
marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents:
19343
diff
changeset
|
566 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
567 r_long64(RFILE *p) |
|
4592
3bf9e2beaf8c
Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
568 { |
|
71554
9e293f617544
Fix style in code added by edba722f3b02
Éric Araujo <merwok@netwok.org>
parents:
71134
diff
changeset
|
569 PyObject *result = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
570 long lo4 = r_long(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
571 long hi4 = r_long(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
572 |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
573 if (!PyErr_Occurred()) { |
|
4656
186c2ad4abf3
Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4592
diff
changeset
|
574 #if SIZEOF_LONG > 4 |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
575 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
576 result = PyLong_FromLong(x); |
|
4656
186c2ad4abf3
Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4592
diff
changeset
|
577 #else |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
578 unsigned char buf[8]; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
579 int one = 1; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
580 int is_little_endian = (int)*(char*)&one; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
581 if (is_little_endian) { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
582 memcpy(buf, &lo4, 4); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
583 memcpy(buf+4, &hi4, 4); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
584 } |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
585 else { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
586 memcpy(buf, &hi4, 4); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
587 memcpy(buf+4, &lo4, 4); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
588 } |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
589 result = _PyLong_FromByteArray(buf, 8, is_little_endian, 1); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
590 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
591 } |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
592 return result; |
| 267 | 593 } |
| 594 | |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
595 static PyObject * |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
596 r_PyLong(RFILE *p) |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
597 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
598 PyLongObject *ob; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
599 int size, i, j, md, shorts_in_top_digit; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
600 long n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
601 digit d; |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
602 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
603 n = r_long(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
604 if (PyErr_Occurred()) |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
605 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
606 if (n == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
607 return (PyObject *)_PyLong_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
608 if (n < -INT_MAX || n > INT_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
609 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
610 "bad marshal data (long size out of range)"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
611 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
612 } |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
613 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
614 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
615 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
616 ob = _PyLong_New(size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
617 if (ob == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
618 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
619 Py_SIZE(ob) = n > 0 ? size : -size; |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
620 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
621 for (i = 0; i < size-1; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
622 d = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
623 for (j=0; j < PyLong_MARSHAL_RATIO; j++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
624 md = r_short(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
625 if (PyErr_Occurred()) |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
626 break; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
627 if (md < 0 || md > PyLong_MARSHAL_BASE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
628 goto bad_digit; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
629 d += (digit)md << j*PyLong_MARSHAL_SHIFT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
630 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
631 ob->ob_digit[i] = d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
632 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
633 d = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
634 for (j=0; j < shorts_in_top_digit; j++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
635 md = r_short(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
636 if (PyErr_Occurred()) |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
637 break; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
638 if (md < 0 || md > PyLong_MARSHAL_BASE) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
639 goto bad_digit; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
640 /* topmost marshal digit should be nonzero */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
641 if (md == 0 && j == shorts_in_top_digit - 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
642 Py_DECREF(ob); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
643 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
644 "bad marshal data (unnormalized long data)"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
645 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
646 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
647 d += (digit)md << j*PyLong_MARSHAL_SHIFT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
648 } |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
649 if (PyErr_Occurred()) { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
650 Py_DECREF(ob); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
651 return NULL; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
652 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
653 /* top digit should be nonzero, else the resulting PyLong won't be |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
654 normalized */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
655 ob->ob_digit[size-1] = d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
656 return (PyObject *)ob; |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
657 bad_digit: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
658 Py_DECREF(ob); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
659 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
660 "bad marshal data (digit out of range in long)"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
661 return NULL; |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
662 } |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
663 |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
664 |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
665 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
666 r_object(RFILE *p) |
| 267 | 667 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
668 /* NULL is a valid return value, it does not necessarily means that |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
669 an exception is set. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
670 PyObject *v, *v2; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
671 long i, n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
672 int type = r_byte(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
673 PyObject *retval; |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41715
diff
changeset
|
674 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
675 p->depth++; |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41715
diff
changeset
|
676 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
677 if (p->depth > MAX_MARSHAL_STACK_DEPTH) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
678 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
679 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
680 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
681 } |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
682 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
683 switch (type) { |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
684 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
685 case EOF: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
686 PyErr_SetString(PyExc_EOFError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
687 "EOF read where object expected"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
688 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
689 break; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
690 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
691 case TYPE_NULL: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
692 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
693 break; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
694 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
695 case TYPE_NONE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
696 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
697 retval = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
698 break; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
699 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
700 case TYPE_STOPITER: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
701 Py_INCREF(PyExc_StopIteration); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
702 retval = PyExc_StopIteration; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
703 break; |
|
18148
7bc473b2c654
Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents:
17707
diff
changeset
|
704 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
705 case TYPE_ELLIPSIS: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
706 Py_INCREF(Py_Ellipsis); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
707 retval = Py_Ellipsis; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
708 break; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
709 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
710 case TYPE_FALSE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
711 Py_INCREF(Py_False); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
712 retval = Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
713 break; |
|
22785
aa8d59823add
Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents:
22705
diff
changeset
|
714 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
715 case TYPE_TRUE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
716 Py_INCREF(Py_True); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
717 retval = Py_True; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
718 break; |
|
22785
aa8d59823add
Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents:
22705
diff
changeset
|
719 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
720 case TYPE_INT: |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
721 n = r_long(p); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
722 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
723 break; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
724 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
725 case TYPE_INT64: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
726 retval = r_long64(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
727 break; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
728 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
729 case TYPE_LONG: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
730 retval = r_PyLong(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
731 break; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
732 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
733 case TYPE_FLOAT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
734 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
735 char buf[256]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
736 double dx; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
737 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
738 n = r_byte(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
739 if (n == EOF || r_string(buf, (int)n, p) != n) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
740 PyErr_SetString(PyExc_EOFError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
741 "EOF read where object expected"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
742 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
743 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
744 buf[n] = '\0'; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
745 dx = PyOS_string_to_double(buf, NULL, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
746 if (dx == -1.0 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
747 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
748 retval = PyFloat_FromDouble(dx); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
749 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
750 } |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
751 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
752 case TYPE_BINARY_FLOAT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
753 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
754 unsigned char buf[8]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
755 double x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
756 if (r_string((char*)buf, 8, p) != 8) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
757 PyErr_SetString(PyExc_EOFError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
758 "EOF read where object expected"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
759 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
760 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
761 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
762 x = _PyFloat_Unpack8(buf, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
763 if (x == -1.0 && PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
764 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
765 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
766 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
767 retval = PyFloat_FromDouble(x); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
768 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
769 } |
| 35008 | 770 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
771 case TYPE_COMPLEX: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
772 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
773 char buf[256]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
774 Py_complex c; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
775 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
776 n = r_byte(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
777 if (n == EOF || r_string(buf, (int)n, p) != n) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
778 PyErr_SetString(PyExc_EOFError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
779 "EOF read where object expected"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
780 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
781 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
782 buf[n] = '\0'; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
783 c.real = PyOS_string_to_double(buf, NULL, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
784 if (c.real == -1.0 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
785 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
786 n = r_byte(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
787 if (n == EOF || r_string(buf, (int)n, p) != n) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
788 PyErr_SetString(PyExc_EOFError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
789 "EOF read where object expected"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
790 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
791 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
792 buf[n] = '\0'; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
793 c.imag = PyOS_string_to_double(buf, NULL, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
794 if (c.imag == -1.0 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
795 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
796 retval = PyComplex_FromCComplex(c); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
797 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
798 } |
| 35008 | 799 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
800 case TYPE_BINARY_COMPLEX: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
801 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
802 unsigned char buf[8]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
803 Py_complex c; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
804 if (r_string((char*)buf, 8, p) != 8) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
805 PyErr_SetString(PyExc_EOFError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
806 "EOF read where object expected"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
807 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
808 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
809 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
810 c.real = _PyFloat_Unpack8(buf, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
811 if (c.real == -1.0 && PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
812 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
813 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
814 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
815 if (r_string((char*)buf, 8, p) != 8) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
816 PyErr_SetString(PyExc_EOFError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
817 "EOF read where object expected"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
818 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
819 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
820 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
821 c.imag = _PyFloat_Unpack8(buf, 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
822 if (c.imag == -1.0 && PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
823 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
824 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
825 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
826 retval = PyComplex_FromCComplex(c); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
827 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
828 } |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
829 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
830 case TYPE_STRING: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
831 n = r_long(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
832 if (PyErr_Occurred()) { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
833 retval = NULL; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
834 break; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
835 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
836 if (n < 0 || n > INT_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
837 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
838 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
839 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
840 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
841 v = PyBytes_FromStringAndSize((char *)NULL, n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
842 if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
843 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
844 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
845 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
846 if (r_string(PyBytes_AS_STRING(v), (int)n, p) != n) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
847 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
848 PyErr_SetString(PyExc_EOFError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
849 "EOF read where object expected"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
850 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
851 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
852 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
853 retval = v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
854 break; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
855 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
856 case TYPE_UNICODE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
857 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
858 char *buffer; |
|
11976
513354d87a85
Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents:
9300
diff
changeset
|
859 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
860 n = r_long(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
861 if (PyErr_Occurred()) { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
862 retval = NULL; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
863 break; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
864 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
865 if (n < 0 || n > INT_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
866 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
867 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
868 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
869 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
870 buffer = PyMem_NEW(char, n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
871 if (buffer == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
872 retval = PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
873 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
874 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
875 if (r_string(buffer, (int)n, p) != n) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
876 PyMem_DEL(buffer); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
877 PyErr_SetString(PyExc_EOFError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
878 "EOF read where object expected"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
879 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
880 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
881 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
882 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
883 PyMem_DEL(buffer); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
884 retval = v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
885 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
886 } |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
887 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
888 case TYPE_TUPLE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
889 n = r_long(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
890 if (PyErr_Occurred()) { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
891 retval = NULL; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
892 break; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
893 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
894 if (n < 0 || n > INT_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
895 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
896 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
897 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
898 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
899 v = PyTuple_New((int)n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
900 if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
901 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
902 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
903 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
904 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
905 v2 = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
906 if ( v2 == NULL ) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
907 if (!PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
908 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
909 "NULL object in marshal data for tuple"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
910 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
911 v = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
912 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
913 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
914 PyTuple_SET_ITEM(v, (int)i, v2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
915 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
916 retval = v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
917 break; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
918 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
919 case TYPE_LIST: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
920 n = r_long(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
921 if (PyErr_Occurred()) { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
922 retval = NULL; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
923 break; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
924 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
925 if (n < 0 || n > INT_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
926 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
927 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
928 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
929 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
930 v = PyList_New((int)n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
931 if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
932 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
933 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
934 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
935 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
936 v2 = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
937 if ( v2 == NULL ) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
938 if (!PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
939 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
940 "NULL object in marshal data for list"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
941 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
942 v = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
943 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
944 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
945 PyList_SET_ITEM(v, (int)i, v2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
946 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
947 retval = v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
948 break; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
949 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
950 case TYPE_DICT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
951 v = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
952 if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
953 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
954 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
955 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
956 for (;;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
957 PyObject *key, *val; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
958 key = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
959 if (key == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
960 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
961 val = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
962 if (val != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
963 PyDict_SetItem(v, key, val); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
964 Py_DECREF(key); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
965 Py_XDECREF(val); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
966 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
967 if (PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
968 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
969 v = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
970 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
971 retval = v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
972 break; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
973 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
974 case TYPE_SET: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
975 case TYPE_FROZENSET: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
976 n = r_long(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
977 if (PyErr_Occurred()) { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
978 retval = NULL; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
979 break; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
980 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
981 if (n < 0 || n > INT_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
982 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
983 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
984 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
985 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
986 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
987 if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
988 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
989 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
990 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
991 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
992 v2 = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
993 if ( v2 == NULL ) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
994 if (!PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
995 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
996 "NULL object in marshal data for set"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
997 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
998 v = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
999 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1000 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1001 if (PySet_Add(v, v2) == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1002 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1003 Py_DECREF(v2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1004 v = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1005 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1006 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1007 Py_DECREF(v2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1008 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1009 retval = v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1010 break; |
|
34394
b480abaf1f6f
SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents:
34205
diff
changeset
|
1011 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1012 case TYPE_CODE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1013 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1014 int argcount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1015 int kwonlyargcount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1016 int nlocals; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1017 int stacksize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1018 int flags; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1019 PyObject *code = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1020 PyObject *consts = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1021 PyObject *names = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1022 PyObject *varnames = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1023 PyObject *freevars = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1024 PyObject *cellvars = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1025 PyObject *filename = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1026 PyObject *name = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1027 int firstlineno; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1028 PyObject *lnotab = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1029 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1030 v = NULL; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1031 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1032 /* XXX ignore long->int overflows for now */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1033 argcount = (int)r_long(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1034 if (PyErr_Occurred()) |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1035 goto code_error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1036 kwonlyargcount = (int)r_long(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1037 if (PyErr_Occurred()) |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1038 goto code_error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1039 nlocals = (int)r_long(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1040 if (PyErr_Occurred()) |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1041 goto code_error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1042 stacksize = (int)r_long(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1043 if (PyErr_Occurred()) |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1044 goto code_error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1045 flags = (int)r_long(p); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1046 if (PyErr_Occurred()) |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1047 goto code_error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1048 code = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1049 if (code == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1050 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1051 consts = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1052 if (consts == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1053 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1054 names = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1055 if (names == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1056 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1057 varnames = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1058 if (varnames == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1059 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1060 freevars = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1061 if (freevars == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1062 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1063 cellvars = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1064 if (cellvars == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1065 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1066 filename = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1067 if (filename == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1068 goto code_error; |
|
70435
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1069 if (PyUnicode_CheckExact(filename)) { |
|
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1070 if (p->current_filename != NULL) { |
|
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1071 if (!PyUnicode_Compare(filename, p->current_filename)) { |
|
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1072 Py_DECREF(filename); |
|
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1073 Py_INCREF(p->current_filename); |
|
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1074 filename = p->current_filename; |
|
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1075 } |
|
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1076 } |
|
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1077 else { |
|
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1078 p->current_filename = filename; |
|
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1079 } |
|
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1080 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1081 name = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1082 if (name == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1083 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1084 firstlineno = (int)r_long(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1085 lnotab = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1086 if (lnotab == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1087 goto code_error; |
| 35008 | 1088 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1089 v = (PyObject *) PyCode_New( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1090 argcount, kwonlyargcount, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1091 nlocals, stacksize, flags, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1092 code, consts, names, varnames, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1093 freevars, cellvars, filename, name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1094 firstlineno, lnotab); |
| 35008 | 1095 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1096 code_error: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1097 Py_XDECREF(code); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1098 Py_XDECREF(consts); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1099 Py_XDECREF(names); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1100 Py_XDECREF(varnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1101 Py_XDECREF(freevars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1102 Py_XDECREF(cellvars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1103 Py_XDECREF(filename); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1104 Py_XDECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1105 Py_XDECREF(lnotab); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1106 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1107 retval = v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1108 break; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1109 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1110 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1111 /* Bogus data got written, which isn't ideal. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1112 This will let you keep working and recover. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1113 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1114 retval = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1115 break; |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1116 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1117 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1118 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1119 return retval; |
| 267 | 1120 } |
| 1121 | |
|
32343
54b257e55f99
Make private function static
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
1122 static PyObject * |
|
31824
331de8b9d1ed
Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents:
30311
diff
changeset
|
1123 read_object(RFILE *p) |
|
331de8b9d1ed
Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents:
30311
diff
changeset
|
1124 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1125 PyObject *v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1126 if (PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1127 fprintf(stderr, "XXX readobject called with exception set\n"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1128 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1129 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1130 v = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1131 if (v == NULL && !PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1132 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1133 return v; |
|
31824
331de8b9d1ed
Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents:
30311
diff
changeset
|
1134 } |
|
331de8b9d1ed
Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents:
30311
diff
changeset
|
1135 |
|
20552
65dd6157f999
SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents:
19605
diff
changeset
|
1136 int |
|
65dd6157f999
SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents:
19605
diff
changeset
|
1137 PyMarshal_ReadShortFromFile(FILE *fp) |
|
65dd6157f999
SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents:
19605
diff
changeset
|
1138 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1139 RFILE rf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1140 assert(fp); |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1141 rf.readable = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1142 rf.fp = fp; |
|
70435
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1143 rf.current_filename = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1144 rf.end = rf.ptr = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1145 return r_short(&rf); |
|
20552
65dd6157f999
SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents:
19605
diff
changeset
|
1146 } |
|
65dd6157f999
SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents:
19605
diff
changeset
|
1147 |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1148 long |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
1149 PyMarshal_ReadLongFromFile(FILE *fp) |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1150 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1151 RFILE rf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1152 rf.fp = fp; |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1153 rf.readable = NULL; |
|
70435
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1154 rf.current_filename = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1155 rf.ptr = rf.end = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1156 return r_long(&rf); |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1157 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1158 |
|
15979
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1159 #ifdef HAVE_FSTAT |
|
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1160 /* Return size of file in bytes; < 0 if unknown. */ |
|
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1161 static off_t |
|
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1162 getfilesize(FILE *fp) |
|
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1163 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1164 struct stat st; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1165 if (fstat(fileno(fp), &st) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1166 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1167 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1168 return st.st_size; |
|
15979
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1169 } |
|
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1170 #endif |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1171 |
|
15979
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1172 /* If we can get the size of the file up-front, and it's reasonably small, |
|
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1173 * read it in one gulp and delegate to ...FromString() instead. Much quicker |
|
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1174 * than reading a byte at a time from file; speeds .pyc imports. |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1175 * CAUTION: since this may read the entire remainder of the file, don't |
|
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1176 * call it unless you know you're done with the file. |
|
15979
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1177 */ |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1178 PyObject * |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1179 PyMarshal_ReadLastObjectFromFile(FILE *fp) |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1180 { |
|
60825
92a633a30acb
Merged revisions 80325 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56594
diff
changeset
|
1181 /* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */ |
|
15979
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1182 #define REASONABLE_FILE_LIMIT (1L << 18) |
|
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1183 #ifdef HAVE_FSTAT |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1184 off_t filesize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1185 filesize = getfilesize(fp); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60825
diff
changeset
|
1186 if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) { |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60825
diff
changeset
|
1187 char* pBuf = (char *)PyMem_MALLOC(filesize); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1188 if (pBuf != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1189 PyObject* v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1190 size_t n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1191 /* filesize must fit into an int, because it |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1192 is smaller than REASONABLE_FILE_LIMIT */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1193 n = fread(pBuf, 1, (int)filesize, fp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1194 v = PyMarshal_ReadObjectFromString(pBuf, n); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60825
diff
changeset
|
1195 PyMem_FREE(pBuf); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1196 return v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1197 } |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1198 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1199 } |
|
15979
a36a4932e399
Variant of SF patch 103252: Startup optimize: read *.pyc as string, not with getc().
Tim Peters <tim.peters@gmail.com>
parents:
15408
diff
changeset
|
1200 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1201 /* We don't have fstat, or we do but the file is larger than |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1202 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1203 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1204 return PyMarshal_ReadObjectFromFile(fp); |
|
16311
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1205 |
|
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1206 #undef REASONABLE_FILE_LIMIT |
|
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1207 } |
|
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1208 |
|
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1209 PyObject * |
|
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1210 PyMarshal_ReadObjectFromFile(FILE *fp) |
|
8c41f3861aad
It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents:
16257
diff
changeset
|
1211 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1212 RFILE rf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1213 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1214 rf.fp = fp; |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1215 rf.readable = NULL; |
|
70435
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1216 rf.current_filename = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1217 rf.depth = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1218 rf.ptr = rf.end = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1219 result = r_object(&rf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1220 return result; |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1221 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1222 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1223 PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36324
diff
changeset
|
1224 PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len) |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1225 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1226 RFILE rf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1227 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1228 rf.fp = NULL; |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1229 rf.readable = NULL; |
|
70435
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1230 rf.current_filename = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1231 rf.ptr = str; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1232 rf.end = str + len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1233 rf.depth = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1234 result = r_object(&rf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1235 return result; |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1236 } |
|
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1237 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1238 PyObject * |
|
32422
3df36e2e5ddc
Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents:
32343
diff
changeset
|
1239 PyMarshal_WriteObjectToString(PyObject *x, int version) |
|
4039
23f280ab5409
Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents:
3839
diff
changeset
|
1240 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1241 WFILE wf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1242 PyObject *res = NULL; |
|
41653
52533370f1ad
Make test_marshal pass. Not my best work. :-(
Guido van Rossum <guido@python.org>
parents:
41595
diff
changeset
|
1243 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1244 wf.fp = NULL; |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1245 wf.readable = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1246 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1247 if (wf.str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1248 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1249 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1250 wf.end = wf.ptr + PyBytes_Size(wf.str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1251 wf.error = WFERR_OK; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1252 wf.depth = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1253 wf.version = version; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1254 w_object(x, &wf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1255 if (wf.str != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1256 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1257 if (wf.ptr - base > PY_SSIZE_T_MAX) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1258 Py_DECREF(wf.str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1259 PyErr_SetString(PyExc_OverflowError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1260 "too much marshal data for a string"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1261 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1262 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1263 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1264 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1265 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1266 if (wf.error != WFERR_OK) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1267 Py_XDECREF(wf.str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1268 if (wf.error == WFERR_NOMEMORY) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1269 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1270 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1271 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1272 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1273 :"object too deeply nested to marshal"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1274 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1275 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1276 if (wf.str != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1277 /* XXX Quick hack -- need to do this differently */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1278 res = PyBytes_FromObject(wf.str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1279 Py_DECREF(wf.str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1280 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1281 return res; |
|
4039
23f280ab5409
Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents:
3839
diff
changeset
|
1282 } |
|
23f280ab5409
Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents:
3839
diff
changeset
|
1283 |
|
279
9c924f9c3b16
Add marshalling for dictionaries.
Guido van Rossum <guido@python.org>
parents:
272
diff
changeset
|
1284 /* And an interface for Python programs... */ |
| 267 | 1285 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1286 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
1287 marshal_dump(PyObject *self, PyObject *args) |
| 267 | 1288 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1289 /* XXX Quick hack -- need to do this differently */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1290 PyObject *x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1291 PyObject *f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1292 int version = Py_MARSHAL_VERSION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1293 PyObject *s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1294 PyObject *res; |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
1295 _Py_IDENTIFIER(write); |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
1296 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1297 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1298 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1299 s = PyMarshal_WriteObjectToString(x, version); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1300 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1301 return NULL; |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
1302 res = _PyObject_CallMethodId(f, &PyId_write, "O", s); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1303 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1304 return res; |
| 267 | 1305 } |
| 1306 | |
|
54035
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1307 PyDoc_STRVAR(dump_doc, |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1308 "dump(value, file[, version])\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1309 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1310 Write the value on the open file. The value must be a supported type.\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1311 The file must be an open file object such as sys.stdout or returned by\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1312 open() or os.popen(). It must be opened in binary mode ('wb' or 'w+b').\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1313 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1314 If the value has (or contains an object that has) an unsupported type, a\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1315 ValueError exception is raised — but garbage data will also be written\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1316 to the file. The object will not be properly read back by load()\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1317 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1318 The version argument indicates the data format that dump should use."); |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1319 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1320 static PyObject * |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
36866
diff
changeset
|
1321 marshal_load(PyObject *self, PyObject *f) |
| 267 | 1322 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1323 PyObject *data, *result; |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
1324 _Py_IDENTIFIER(read); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1325 RFILE rf; |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1326 |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1327 /* |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1328 * Make a call to the read method, but read zero bytes. |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1329 * This is to ensure that the object passed in at least |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1330 * has a read method which returns bytes. |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1331 */ |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
1332 data = _PyObject_CallMethodId(f, &PyId_read, "i", 0); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1333 if (data == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1334 return NULL; |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1335 if (!PyBytes_Check(data)) { |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1336 PyErr_Format(PyExc_TypeError, |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1337 "f.read() returned not bytes but %.100s", |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1338 data->ob_type->tp_name); |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1339 result = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1340 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1341 else { |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1342 rf.depth = 0; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1343 rf.fp = NULL; |
|
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1344 rf.readable = f; |
|
71136
42193f3ffc94
Correct uninitialized data problem in marshal code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
71135
diff
changeset
|
1345 rf.current_filename = NULL; |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1346 result = read_object(&rf); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1347 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1348 Py_DECREF(data); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1349 return result; |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1350 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1351 |
|
54035
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1352 PyDoc_STRVAR(load_doc, |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1353 "load(file)\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1354 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1355 Read one value from the open file and return it. If no valid value is\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1356 read (e.g. because the data has a different Python version’s\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1357 incompatible marshal format), raise EOFError, ValueError or TypeError.\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1358 The file must be an open file object opened in binary mode ('rb' or\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1359 'r+b').\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1360 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1361 Note: If an object containing an unsupported type was marshalled with\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1362 dump(), load() will substitute None for the unmarshallable type."); |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1363 |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1364 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1365 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
1366 marshal_dumps(PyObject *self, PyObject *args) |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1367 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1368 PyObject *x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1369 int version = Py_MARSHAL_VERSION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1370 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1371 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1372 return PyMarshal_WriteObjectToString(x, version); |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1373 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1374 |
|
54035
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1375 PyDoc_STRVAR(dumps_doc, |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1376 "dumps(value[, version])\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1377 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1378 Return the string that would be written to a file by dump(value, file).\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1379 The value must be a supported type. Raise a ValueError exception if\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1380 value has (or contains an object that has) an unsupported type.\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1381 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1382 The version argument indicates the data format that dumps should use."); |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1383 |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1384 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1385 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
1386 marshal_loads(PyObject *self, PyObject *args) |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1387 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1388 RFILE rf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1389 Py_buffer p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1390 char *s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1391 Py_ssize_t n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1392 PyObject* result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1393 if (!PyArg_ParseTuple(args, "s*:loads", &p)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1394 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1395 s = p.buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1396 n = p.len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1397 rf.fp = NULL; |
|
71131
edba722f3b02
Closes #12291: Fixed bug which was found when doing multiple loads from one stream.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
68257
diff
changeset
|
1398 rf.readable = NULL; |
|
70435
27359a4e0f8c
try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents:
70434
diff
changeset
|
1399 rf.current_filename = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1400 rf.ptr = s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1401 rf.end = s + n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1402 rf.depth = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1403 result = read_object(&rf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1404 PyBuffer_Release(&p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1405 return result; |
| 267 | 1406 } |
| 1407 | |
|
54035
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1408 PyDoc_STRVAR(loads_doc, |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1409 "loads(string)\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1410 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1411 Convert the string to a value. If no valid value is found, raise\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1412 EOFError, ValueError or TypeError. Extra characters in the string are\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1413 ignored."); |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1414 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1415 static PyMethodDef marshal_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1416 {"dump", marshal_dump, METH_VARARGS, dump_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1417 {"load", marshal_load, METH_O, load_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1418 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1419 {"loads", marshal_loads, METH_VARARGS, loads_doc}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1420 {NULL, NULL} /* sentinel */ |
| 267 | 1421 }; |
| 1422 | |
|
54035
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1423 |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1424 PyDoc_STRVAR(module_doc, |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1425 "This module contains functions that can read and write Python values in\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1426 a binary format. The format is specific to Python, but independent of\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1427 machine architecture issues.\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1428 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1429 Not all Python object types are supported; in general, only objects\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1430 whose value is independent from a particular invocation of Python can be\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1431 written and read by this module. The following types are supported:\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1432 None, integers, floating point numbers, strings, bytes, bytearrays,\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1433 tuples, lists, sets, dictionaries, and code objects, where it\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1434 should be understood that tuples, lists and dictionaries are only\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1435 supported as long as the values contained therein are themselves\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1436 supported; and recursive lists and dictionaries should not be written\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1437 (they will cause infinite loops).\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1438 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1439 Variables:\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1440 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1441 version -- indicates the format that the module uses. Version 0 is the\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1442 historical format, version 1 shares interned strings and version 2\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1443 uses a binary format for floating point numbers.\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1444 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1445 Functions:\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1446 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1447 dump() -- write value to a file\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1448 load() -- read value from a file\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1449 dumps() -- write value to a string\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1450 loads() -- read value from a string"); |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1451 |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1452 |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1453 |
|
48370
bfaf14295794
Rename a variable to be more in line with the name of the module.
Brett Cannon <bcannon@gmail.com>
parents:
48321
diff
changeset
|
1454 static struct PyModuleDef marshalmodule = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1455 PyModuleDef_HEAD_INIT, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1456 "marshal", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1457 module_doc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1458 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1459 marshal_methods, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1460 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1461 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1462 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1463 NULL |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47343
diff
changeset
|
1464 }; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47343
diff
changeset
|
1465 |
|
30311
f003e48f562d
Bug #794140: cygwin builds do not embed
Jason Tishler <jason@tishler.net>
parents:
24435
diff
changeset
|
1466 PyMODINIT_FUNC |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
1467 PyMarshal_Init(void) |
| 267 | 1468 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1469 PyObject *mod = PyModule_Create(&marshalmodule); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1470 if (mod == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1471 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1472 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1473 return mod; |
| 267 | 1474 } |
