Mercurial > cpython-lru_cache-weakref
annotate Python/marshal.c @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | e086cb1c6e5a |
| children |
| rev | line source |
|---|---|
| 267 | 1 |
| 2 /* Write Python objects to files and read them back. | |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
3 This is primarily intended for writing and reading compiled Python code, |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
4 even though dicts, lists, sets and frozensets, not commonly seen in |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
5 code objects, are supported. |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
6 Version 3 of this protocol properly supports circular links |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
7 and sharing. */ |
| 267 | 8 |
|
36792
688795873ff1
Make Py_ssize_t clean.
Thomas Wouters <thomas@python.org>
parents:
36784
diff
changeset
|
9 #define PY_SSIZE_T_CLEAN |
|
688795873ff1
Make Py_ssize_t clean.
Thomas Wouters <thomas@python.org>
parents:
36784
diff
changeset
|
10 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
11 #include "Python.h" |
| 267 | 12 #include "longintrepr.h" |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35346
diff
changeset
|
13 #include "code.h" |
| 267 | 14 #include "marshal.h" |
| 15 | |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
16 #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
|
17 |
|
13070
7392e71f6cce
Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
18 /* 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
|
19 * 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
|
20 * 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
|
21 * On Windows debug builds, reduce this value. |
|
13070
7392e71f6cce
Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
22 */ |
|
43007
5fde5d6964d7
[Oops, I forgot half of the patch.]
Guido van Rossum <guido@python.org>
parents:
42665
diff
changeset
|
23 #if defined(MS_WINDOWS) && defined(_DEBUG) |
|
5fde5d6964d7
[Oops, I forgot half of the patch.]
Guido van Rossum <guido@python.org>
parents:
42665
diff
changeset
|
24 #define MAX_MARSHAL_STACK_DEPTH 1500 |
|
5fde5d6964d7
[Oops, I forgot half of the patch.]
Guido van Rossum <guido@python.org>
parents:
42665
diff
changeset
|
25 #else |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41715
diff
changeset
|
26 #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
|
27 #endif |
|
13070
7392e71f6cce
Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
28 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
29 #define TYPE_NULL '0' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
30 #define TYPE_NONE 'N' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
31 #define TYPE_FALSE 'F' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
32 #define TYPE_TRUE 'T' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
33 #define TYPE_STOPITER 'S' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
34 #define TYPE_ELLIPSIS '.' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
35 #define TYPE_INT 'i' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
36 #define TYPE_FLOAT 'f' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
37 #define TYPE_BINARY_FLOAT 'g' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
38 #define TYPE_COMPLEX 'x' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
39 #define TYPE_BINARY_COMPLEX 'y' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
40 #define TYPE_LONG 'l' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
41 #define TYPE_STRING 's' |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
42 #define TYPE_INTERNED 't' |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
43 #define TYPE_REF 'r' |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
44 #define TYPE_TUPLE '(' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
45 #define TYPE_LIST '[' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
46 #define TYPE_DICT '{' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
47 #define TYPE_CODE 'c' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
48 #define TYPE_UNICODE 'u' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
49 #define TYPE_UNKNOWN '?' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
50 #define TYPE_SET '<' |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
51 #define TYPE_FROZENSET '>' |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
52 #define FLAG_REF '\x80' /* with a type, add obj to index */ |
| 267 | 53 |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
54 #define TYPE_ASCII 'a' |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
55 #define TYPE_ASCII_INTERNED 'A' |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
56 #define TYPE_SMALL_TUPLE ')' |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
57 #define TYPE_SHORT_ASCII 'z' |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
58 #define TYPE_SHORT_ASCII_INTERNED 'Z' |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
59 |
|
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
|
60 #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
|
61 #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
|
62 #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
|
63 #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
|
64 |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
65 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
66 FILE *fp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
67 int error; /* see WFERR_* values */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
68 int depth; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
69 /* 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
|
70 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
|
71 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
|
72 PyObject *current_filename; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
73 char *ptr; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
74 char *end; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
75 char *buf; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
76 Py_ssize_t buf_size; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
77 PyObject *refs; /* dict on marshal, list on unmarshal */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
78 int version; |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
79 } WFILE; |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
80 |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
81 #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
|
82 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \ |
|
87131
e086cb1c6e5a
Fix compiler warning (on Windows 64-bit): explicit cast Py_ssize_t to unsigned
Victor Stinner <victor.stinner@gmail.com>
parents:
86810
diff
changeset
|
83 else w_more((c), p) |
| 267 | 84 |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
85 static void |
|
86262
0383f08bff4c
Try to fix weird assertion error on the Fedora buildbot.
Antoine Pitrou <solipsis@pitrou.net>
parents:
86255
diff
changeset
|
86 w_more(char c, WFILE *p) |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
87 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
88 Py_ssize_t size, newsize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
89 if (p->str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
90 return; /* An error already occurred */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
91 size = PyBytes_Size(p->str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
92 newsize = size + size + 1024; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
93 if (newsize > 32*1024*1024) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
94 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
|
95 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
96 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
|
97 p->ptr = p->end = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
98 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
99 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
100 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
|
101 p->end = |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
102 PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize; |
|
86262
0383f08bff4c
Try to fix weird assertion error on the Fedora buildbot.
Antoine Pitrou <solipsis@pitrou.net>
parents:
86255
diff
changeset
|
103 *p->ptr++ = c; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
104 } |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
105 } |
|
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 static void |
|
84546
8b99f2224c3a
Fix reference leaks introduced by the patch for issue #5308.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82191
diff
changeset
|
108 w_string(const char *s, Py_ssize_t n, WFILE *p) |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
109 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
110 if (p->fp != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
111 fwrite(s, 1, n, p->fp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
112 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
113 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
114 while (--n >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
115 w_byte(*s, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
116 s++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
117 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
118 } |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
119 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
120 |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
121 static void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
122 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
|
123 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
124 w_byte((char)( x & 0xff), p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
125 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
|
126 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
127 |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
128 static void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
129 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
|
130 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
131 w_byte((char)( x & 0xff), p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
132 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
|
133 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
|
134 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
|
135 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
136 |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
137 #define SIZE32_MAX 0x7FFFFFFF |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
138 |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
139 #if SIZEOF_SIZE_T > 4 |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
140 # define W_SIZE(n, p) do { \ |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
141 if ((n) > SIZE32_MAX) { \ |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
142 (p)->depth--; \ |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
143 (p)->error = WFERR_UNMARSHALLABLE; \ |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
144 return; \ |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
145 } \ |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
146 w_long((long)(n), p); \ |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
147 } while(0) |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
148 #else |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
149 # define W_SIZE w_long |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
150 #endif |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
151 |
|
84546
8b99f2224c3a
Fix reference leaks introduced by the patch for issue #5308.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82191
diff
changeset
|
152 static void |
|
8b99f2224c3a
Fix reference leaks introduced by the patch for issue #5308.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82191
diff
changeset
|
153 w_pstring(const char *s, Py_ssize_t n, WFILE *p) |
|
8b99f2224c3a
Fix reference leaks introduced by the patch for issue #5308.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82191
diff
changeset
|
154 { |
|
8b99f2224c3a
Fix reference leaks introduced by the patch for issue #5308.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82191
diff
changeset
|
155 W_SIZE(n, p); |
|
8b99f2224c3a
Fix reference leaks introduced by the patch for issue #5308.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82191
diff
changeset
|
156 w_string(s, n, p); |
|
8b99f2224c3a
Fix reference leaks introduced by the patch for issue #5308.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82191
diff
changeset
|
157 } |
|
8b99f2224c3a
Fix reference leaks introduced by the patch for issue #5308.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82191
diff
changeset
|
158 |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
159 static void |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
160 w_short_pstring(const char *s, Py_ssize_t n, WFILE *p) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
161 { |
|
86262
0383f08bff4c
Try to fix weird assertion error on the Fedora buildbot.
Antoine Pitrou <solipsis@pitrou.net>
parents:
86255
diff
changeset
|
162 w_byte(Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char), p); |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
163 w_string(s, n, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
164 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
165 |
|
85418
4d62a62ba44d
Issue #18783: Removed existing mentions of Python long type in docstrings,
Serhiy Storchaka <storchaka@gmail.com>
parents:
84556
diff
changeset
|
166 /* We assume that Python ints are stored internally in base some power of |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
167 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
|
168 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
|
169 |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
170 #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
|
171 #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
|
172 #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
|
173 #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
|
174 #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
|
175 #endif |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
176 #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
|
177 |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
178 #define W_TYPE(t, p) do { \ |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
179 w_byte((t) | flag, (p)); \ |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
180 } while(0) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
181 |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
182 static void |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
183 w_PyLong(const PyLongObject *ob, char flag, WFILE *p) |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
184 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
185 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
|
186 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
|
187 |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
188 W_TYPE(TYPE_LONG, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
189 if (Py_SIZE(ob) == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
190 w_long((long)0, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
191 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
192 } |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
193 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
194 /* 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
|
195 n = ABS(Py_SIZE(ob)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
196 l = (n-1) * PyLong_MARSHAL_RATIO; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
197 d = ob->ob_digit[n-1]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
198 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
|
199 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
200 d >>= PyLong_MARSHAL_SHIFT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
201 l++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
202 } while (d != 0); |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
203 if (l > SIZE32_MAX) { |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
204 p->depth--; |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
205 p->error = WFERR_UNMARSHALLABLE; |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
206 return; |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
207 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
208 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
|
209 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
210 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
|
211 d = ob->ob_digit[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
212 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
|
213 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
|
214 d >>= PyLong_MARSHAL_SHIFT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
215 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
216 assert (d == 0); |
|
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 d = ob->ob_digit[n-1]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
219 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
220 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
|
221 d >>= PyLong_MARSHAL_SHIFT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
222 } 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
|
223 } |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
224 |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
225 static int |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
226 w_ref(PyObject *v, char *flag, WFILE *p) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
227 { |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
228 PyObject *id; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
229 PyObject *idx; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
230 |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
231 if (p->version < 3 || p->refs == NULL) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
232 return 0; /* not writing object references */ |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
233 |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
234 /* if it has only one reference, it definitely isn't shared */ |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
235 if (Py_REFCNT(v) == 1) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
236 return 0; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
237 |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
238 id = PyLong_FromVoidPtr((void*)v); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
239 if (id == NULL) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
240 goto err; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
241 idx = PyDict_GetItem(p->refs, id); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
242 if (idx != NULL) { |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
243 /* write the reference index to the stream */ |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
244 long w = PyLong_AsLong(idx); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
245 Py_DECREF(id); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
246 if (w == -1 && PyErr_Occurred()) { |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
247 goto err; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
248 } |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
249 /* we don't store "long" indices in the dict */ |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
250 assert(0 <= w && w <= 0x7fffffff); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
251 w_byte(TYPE_REF, p); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
252 w_long(w, p); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
253 return 1; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
254 } else { |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
255 int ok; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
256 Py_ssize_t s = PyDict_Size(p->refs); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
257 /* we don't support long indices */ |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
258 if (s >= 0x7fffffff) { |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
259 PyErr_SetString(PyExc_ValueError, "too many objects"); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
260 goto err; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
261 } |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
262 idx = PyLong_FromSsize_t(s); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
263 ok = idx && PyDict_SetItem(p->refs, id, idx) == 0; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
264 Py_DECREF(id); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
265 Py_XDECREF(idx); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
266 if (!ok) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
267 goto err; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
268 *flag |= FLAG_REF; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
269 return 0; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
270 } |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
271 err: |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
272 p->error = WFERR_UNMARSHALLABLE; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
273 return 1; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
274 } |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
275 |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
276 static void |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
277 w_complex_object(PyObject *v, char flag, WFILE *p); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
278 |
|
4592
3bf9e2beaf8c
Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
279 static void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
280 w_object(PyObject *v, WFILE *p) |
| 267 | 281 { |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
282 char flag = '\0'; |
|
13070
7392e71f6cce
Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
283 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
284 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
|
285 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
286 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
|
287 p->error = WFERR_NESTEDTOODEEP; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
288 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
289 else if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
290 w_byte(TYPE_NULL, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
291 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
292 else if (v == Py_None) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
293 w_byte(TYPE_NONE, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
294 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
295 else if (v == PyExc_StopIteration) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
296 w_byte(TYPE_STOPITER, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
297 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
298 else if (v == Py_Ellipsis) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
299 w_byte(TYPE_ELLIPSIS, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
300 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
301 else if (v == Py_False) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
302 w_byte(TYPE_FALSE, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
303 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
304 else if (v == Py_True) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
305 w_byte(TYPE_TRUE, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
306 } |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
307 else if (!w_ref(v, &flag, p)) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
308 w_complex_object(v, flag, p); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
309 |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
310 p->depth--; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
311 } |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
312 |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
313 static void |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
314 w_complex_object(PyObject *v, char flag, WFILE *p) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
315 { |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
316 Py_ssize_t i, n; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
317 |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
318 if (PyLong_CheckExact(v)) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
319 long x = PyLong_AsLong(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
320 if ((x == -1) && PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
321 PyLongObject *ob = (PyLongObject *)v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
322 PyErr_Clear(); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
323 w_PyLong(ob, flag, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
324 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
325 else { |
|
4656
186c2ad4abf3
Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4592
diff
changeset
|
326 #if SIZEOF_LONG > 4 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
327 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
|
328 if (y && y != -1) { |
|
78305
461e84fc8c60
Issue #15466: Stop using TYPE_INT64 in marshal,
Martin v. Löwis <martin@v.loewis.de>
parents:
75375
diff
changeset
|
329 /* Too large for TYPE_INT */ |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
330 w_PyLong((PyLongObject*)v, flag, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
331 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
332 else |
|
4656
186c2ad4abf3
Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents:
4592
diff
changeset
|
333 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
334 { |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
335 W_TYPE(TYPE_INT, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
336 w_long(x, 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 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
340 else if (PyFloat_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
341 if (p->version > 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
342 unsigned char buf[8]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
343 if (_PyFloat_Pack8(PyFloat_AsDouble(v), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
344 buf, 1) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
345 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
346 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
347 } |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
348 W_TYPE(TYPE_BINARY_FLOAT, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
349 w_string((char*)buf, 8, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
350 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
351 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
352 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
|
353 'g', 17, 0, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
354 if (!buf) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
355 p->error = WFERR_NOMEMORY; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
356 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
357 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
358 n = strlen(buf); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
359 W_TYPE(TYPE_FLOAT, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
360 w_byte((int)n, p); |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
361 w_string(buf, n, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
362 PyMem_Free(buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
363 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
364 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
365 else if (PyComplex_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
366 if (p->version > 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
367 unsigned char buf[8]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
368 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
369 buf, 1) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
370 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
371 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
372 } |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
373 W_TYPE(TYPE_BINARY_COMPLEX, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
374 w_string((char*)buf, 8, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
375 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
376 buf, 1) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
377 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
378 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
379 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
380 w_string((char*)buf, 8, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
381 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
382 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
383 char *buf; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
384 W_TYPE(TYPE_COMPLEX, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
385 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
|
386 'g', 17, 0, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
387 if (!buf) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
388 p->error = WFERR_NOMEMORY; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
389 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
390 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
391 n = strlen(buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
392 w_byte((int)n, p); |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
393 w_string(buf, n, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
394 PyMem_Free(buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
395 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
|
396 'g', 17, 0, NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
397 if (!buf) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
398 p->error = WFERR_NOMEMORY; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
399 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
400 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
401 n = strlen(buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
402 w_byte((int)n, p); |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
403 w_string(buf, n, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
404 PyMem_Free(buf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
405 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
406 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
407 else if (PyBytes_CheckExact(v)) { |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
408 W_TYPE(TYPE_STRING, p); |
|
84546
8b99f2224c3a
Fix reference leaks introduced by the patch for issue #5308.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82191
diff
changeset
|
409 w_pstring(PyBytes_AS_STRING(v), PyBytes_GET_SIZE(v), p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
410 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
411 else if (PyUnicode_CheckExact(v)) { |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
412 if (p->version >= 4 && PyUnicode_IS_ASCII(v)) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
413 int is_short = PyUnicode_GET_LENGTH(v) < 256; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
414 if (is_short) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
415 if (PyUnicode_CHECK_INTERNED(v)) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
416 W_TYPE(TYPE_SHORT_ASCII_INTERNED, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
417 else |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
418 W_TYPE(TYPE_SHORT_ASCII, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
419 w_short_pstring((char *) PyUnicode_1BYTE_DATA(v), |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
420 PyUnicode_GET_LENGTH(v), p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
421 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
422 else { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
423 if (PyUnicode_CHECK_INTERNED(v)) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
424 W_TYPE(TYPE_ASCII_INTERNED, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
425 else |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
426 W_TYPE(TYPE_ASCII, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
427 w_pstring((char *) PyUnicode_1BYTE_DATA(v), |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
428 PyUnicode_GET_LENGTH(v), p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
429 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
430 } |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
431 else { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
432 PyObject *utf8; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
433 utf8 = PyUnicode_AsEncodedString(v, "utf8", "surrogatepass"); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
434 if (utf8 == NULL) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
435 p->depth--; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
436 p->error = WFERR_UNMARSHALLABLE; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
437 return; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
438 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
439 if (p->version >= 3 && PyUnicode_CHECK_INTERNED(v)) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
440 W_TYPE(TYPE_INTERNED, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
441 else |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
442 W_TYPE(TYPE_UNICODE, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
443 w_pstring(PyBytes_AS_STRING(utf8), PyBytes_GET_SIZE(utf8), p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
444 Py_DECREF(utf8); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
445 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
446 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
447 else if (PyTuple_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
448 n = PyTuple_Size(v); |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
449 if (p->version >= 4 && n < 256) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
450 W_TYPE(TYPE_SMALL_TUPLE, p); |
|
87131
e086cb1c6e5a
Fix compiler warning (on Windows 64-bit): explicit cast Py_ssize_t to unsigned
Victor Stinner <victor.stinner@gmail.com>
parents:
86810
diff
changeset
|
451 w_byte((unsigned char)n, p); |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
452 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
453 else { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
454 W_TYPE(TYPE_TUPLE, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
455 W_SIZE(n, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
456 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
457 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
458 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
|
459 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
460 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
461 else if (PyList_CheckExact(v)) { |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
462 W_TYPE(TYPE_LIST, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
463 n = PyList_GET_SIZE(v); |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
464 W_SIZE(n, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
465 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
466 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
|
467 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
468 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
469 else if (PyDict_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
470 Py_ssize_t pos; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
471 PyObject *key, *value; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
472 W_TYPE(TYPE_DICT, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
473 /* This one is NULL object terminated! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
474 pos = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
475 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
|
476 w_object(key, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
477 w_object(value, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
478 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
479 w_object((PyObject *)NULL, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
480 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
481 else if (PyAnySet_CheckExact(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
482 PyObject *value, *it; |
|
34394
b480abaf1f6f
SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents:
34205
diff
changeset
|
483 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
484 if (PyObject_TypeCheck(v, &PySet_Type)) |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
485 W_TYPE(TYPE_SET, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
486 else |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
487 W_TYPE(TYPE_FROZENSET, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
488 n = PyObject_Size(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
489 if (n == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
490 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
491 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
492 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
493 } |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
494 W_SIZE(n, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
495 it = PyObject_GetIter(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
496 if (it == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
497 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
498 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
499 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
500 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
501 while ((value = PyIter_Next(it)) != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
502 w_object(value, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
503 Py_DECREF(value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
504 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
505 Py_DECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
506 if (PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
507 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
508 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
509 return; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
510 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
511 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
512 else if (PyCode_Check(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
513 PyCodeObject *co = (PyCodeObject *)v; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
514 W_TYPE(TYPE_CODE, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
515 w_long(co->co_argcount, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
516 w_long(co->co_kwonlyargcount, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
517 w_long(co->co_nlocals, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
518 w_long(co->co_stacksize, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
519 w_long(co->co_flags, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
520 w_object(co->co_code, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
521 w_object(co->co_consts, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
522 w_object(co->co_names, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
523 w_object(co->co_varnames, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
524 w_object(co->co_freevars, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
525 w_object(co->co_cellvars, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
526 w_object(co->co_filename, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
527 w_object(co->co_name, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
528 w_long(co->co_firstlineno, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
529 w_object(co->co_lnotab, p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
530 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
531 else if (PyObject_CheckBuffer(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
532 /* 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
|
533 Py_buffer view; |
|
75369
185a6ae76479
Issue #14172: Fix reference leak when marshalling a buffer-like object (other than a bytes object).
Antoine Pitrou <solipsis@pitrou.net>
parents:
71554
diff
changeset
|
534 if (PyObject_GetBuffer(v, &view, PyBUF_SIMPLE) != 0) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
535 w_byte(TYPE_UNKNOWN, p); |
|
75369
185a6ae76479
Issue #14172: Fix reference leak when marshalling a buffer-like object (other than a bytes object).
Antoine Pitrou <solipsis@pitrou.net>
parents:
71554
diff
changeset
|
536 p->depth--; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
537 p->error = WFERR_UNMARSHALLABLE; |
|
75369
185a6ae76479
Issue #14172: Fix reference leak when marshalling a buffer-like object (other than a bytes object).
Antoine Pitrou <solipsis@pitrou.net>
parents:
71554
diff
changeset
|
538 return; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
539 } |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
540 W_TYPE(TYPE_STRING, p); |
|
84546
8b99f2224c3a
Fix reference leaks introduced by the patch for issue #5308.
Serhiy Storchaka <storchaka@gmail.com>
parents:
82191
diff
changeset
|
541 w_pstring(view.buf, view.len, p); |
|
75369
185a6ae76479
Issue #14172: Fix reference leak when marshalling a buffer-like object (other than a bytes object).
Antoine Pitrou <solipsis@pitrou.net>
parents:
71554
diff
changeset
|
542 PyBuffer_Release(&view); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
543 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
544 else { |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
545 W_TYPE(TYPE_UNKNOWN, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
546 p->error = WFERR_UNMARSHALLABLE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
547 } |
| 267 | 548 } |
| 549 | |
|
85418
4d62a62ba44d
Issue #18783: Removed existing mentions of Python long type in docstrings,
Serhiy Storchaka <storchaka@gmail.com>
parents:
84556
diff
changeset
|
550 /* version currently has no effect for writing ints. */ |
| 267 | 551 void |
|
32422
3df36e2e5ddc
Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents:
32343
diff
changeset
|
552 PyMarshal_WriteLongToFile(long x, FILE *fp, int version) |
| 267 | 553 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
554 WFILE wf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
555 wf.fp = fp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
556 wf.error = WFERR_OK; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
557 wf.depth = 0; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
558 wf.refs = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
559 wf.version = version; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
560 w_long(x, &wf); |
| 267 | 561 } |
| 562 | |
| 563 void | |
|
32422
3df36e2e5ddc
Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents:
32343
diff
changeset
|
564 PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version) |
| 267 | 565 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
566 WFILE wf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
567 wf.fp = fp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
568 wf.error = WFERR_OK; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
569 wf.depth = 0; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
570 if (version >= 3) { |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
571 if ((wf.refs = PyDict_New()) == NULL) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
572 return; /* caller mush check PyErr_Occurred() */ |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
573 } else |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
574 wf.refs = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
575 wf.version = version; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
576 w_object(x, &wf); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
577 Py_XDECREF(wf.refs); |
| 267 | 578 } |
| 579 | |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
580 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
|
581 |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
582 static char * |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
583 r_string(Py_ssize_t n, RFILE *p) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
584 { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
585 Py_ssize_t read = -1; |
|
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
|
586 |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
587 if (p->ptr != NULL) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
588 /* Fast path for loads() */ |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
589 char *res = p->ptr; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
590 Py_ssize_t left = p->end - p->ptr; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
591 if (left < n) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
592 PyErr_SetString(PyExc_EOFError, |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
593 "marshal data too short"); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
594 return NULL; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
595 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
596 p->ptr += n; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
597 return res; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
598 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
599 if (p->buf == NULL) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
600 p->buf = PyMem_MALLOC(n); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
601 if (p->buf == NULL) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
602 PyErr_NoMemory(); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
603 return NULL; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
604 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
605 p->buf_size = n; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
606 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
607 else if (p->buf_size < n) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
608 p->buf = PyMem_REALLOC(p->buf, n); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
609 if (p->buf == NULL) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
610 PyErr_NoMemory(); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
611 return NULL; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
612 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
613 p->buf_size = n; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
614 } |
|
86807
985f8762ee3e
Issue #19437: Fix r_PyLong() of marshal module, stop immediatly at first
Victor Stinner <victor.stinner@gmail.com>
parents:
86484
diff
changeset
|
615 |
|
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
|
616 if (!p->readable) { |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
617 assert(p->fp != NULL); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
618 read = fread(p->buf, 1, n, p->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
|
619 } |
|
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
|
620 else { |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
621 _Py_IDENTIFIER(readinto); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
622 PyObject *res, *mview; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
623 Py_buffer buf; |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
624 |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
625 if (PyBuffer_FillInfo(&buf, NULL, p->buf, n, 0, PyBUF_CONTIG) == -1) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
626 return NULL; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
627 mview = PyMemoryView_FromBuffer(&buf); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
628 if (mview == NULL) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
629 return NULL; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
630 |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
631 res = _PyObject_CallMethodId(p->readable, &PyId_readinto, "N", mview); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
632 if (res != NULL) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
633 read = PyNumber_AsSsize_t(res, PyExc_ValueError); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
634 Py_DECREF(res); |
|
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
|
635 } |
|
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 } |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
637 if (read != n) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
638 if (!PyErr_Occurred()) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
639 if (read > n) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
640 PyErr_Format(PyExc_ValueError, |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
641 "read() returned too much data: " |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
642 "%zd bytes requested, %zd returned", |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
643 n, read); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
644 else |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
645 PyErr_SetString(PyExc_EOFError, |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
646 "EOF read where not expected"); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
647 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
648 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
|
649 } |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
650 return p->buf; |
|
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
|
651 } |
|
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 |
|
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
|
653 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
|
654 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
|
655 { |
|
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
|
656 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
|
657 |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
658 if (p->ptr != NULL) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
659 if (p->ptr < p->end) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
660 c = (unsigned char) *p->ptr++; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
661 return c; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
662 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
663 if (!p->readable) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
664 assert(p->fp); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
665 c = getc(p->fp); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
666 } |
|
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
|
667 else { |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
668 char *ptr = r_string(1, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
669 if (ptr != NULL) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
670 c = *(unsigned 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
|
671 } |
|
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
|
672 return c; |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
673 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
674 |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
675 static int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
676 r_short(RFILE *p) |
| 267 | 677 { |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
678 short x = -1; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
679 unsigned char *buffer; |
|
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
|
680 |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
681 buffer = (unsigned char *) r_string(2, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
682 if (buffer != NULL) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
683 x = buffer[0]; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
684 x |= buffer[1] << 8; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
685 /* Sign-extension, in case short greater than 16 bits */ |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
686 x |= -(x & 0x8000); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
687 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
688 return x; |
| 267 | 689 } |
| 690 | |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
691 static long |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
692 r_long(RFILE *p) |
| 267 | 693 { |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
694 long x = -1; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
695 unsigned char *buffer; |
|
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
|
696 |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
697 buffer = (unsigned char *) r_string(4, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
698 if (buffer != NULL) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
699 x = buffer[0]; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
700 x |= (long)buffer[1] << 8; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
701 x |= (long)buffer[2] << 16; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
702 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
|
703 #if SIZEOF_LONG > 4 |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
704 /* Sign extension for 64-bit machines */ |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
705 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
|
706 #endif |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
707 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
708 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
|
709 } |
|
3bf9e2beaf8c
Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
710 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
711 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
|
712 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
|
713 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
714 PyLongObject *ob; |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
715 long n, size, i; |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
716 int j, md, shorts_in_top_digit; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
717 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
|
718 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
719 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
|
720 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
|
721 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
722 if (n == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
723 return (PyObject *)_PyLong_New(0); |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
724 if (n < -SIZE32_MAX || n > SIZE32_MAX) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
725 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
726 "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
|
727 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
728 } |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
729 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
730 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
|
731 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
|
732 ob = _PyLong_New(size); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
733 if (ob == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
734 return NULL; |
|
86807
985f8762ee3e
Issue #19437: Fix r_PyLong() of marshal module, stop immediatly at first
Victor Stinner <victor.stinner@gmail.com>
parents:
86484
diff
changeset
|
735 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
736 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
|
737 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
738 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
|
739 d = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
740 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
|
741 md = r_short(p); |
|
86807
985f8762ee3e
Issue #19437: Fix r_PyLong() of marshal module, stop immediatly at first
Victor Stinner <victor.stinner@gmail.com>
parents:
86484
diff
changeset
|
742 if (PyErr_Occurred()) { |
|
985f8762ee3e
Issue #19437: Fix r_PyLong() of marshal module, stop immediatly at first
Victor Stinner <victor.stinner@gmail.com>
parents:
86484
diff
changeset
|
743 Py_DECREF(ob); |
|
985f8762ee3e
Issue #19437: Fix r_PyLong() of marshal module, stop immediatly at first
Victor Stinner <victor.stinner@gmail.com>
parents:
86484
diff
changeset
|
744 return NULL; |
|
985f8762ee3e
Issue #19437: Fix r_PyLong() of marshal module, stop immediatly at first
Victor Stinner <victor.stinner@gmail.com>
parents:
86484
diff
changeset
|
745 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
746 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
|
747 goto bad_digit; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
748 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
|
749 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
750 ob->ob_digit[i] = d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
751 } |
|
86807
985f8762ee3e
Issue #19437: Fix r_PyLong() of marshal module, stop immediatly at first
Victor Stinner <victor.stinner@gmail.com>
parents:
86484
diff
changeset
|
752 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
753 d = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
754 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
|
755 md = r_short(p); |
|
86807
985f8762ee3e
Issue #19437: Fix r_PyLong() of marshal module, stop immediatly at first
Victor Stinner <victor.stinner@gmail.com>
parents:
86484
diff
changeset
|
756 if (PyErr_Occurred()) { |
|
985f8762ee3e
Issue #19437: Fix r_PyLong() of marshal module, stop immediatly at first
Victor Stinner <victor.stinner@gmail.com>
parents:
86484
diff
changeset
|
757 Py_DECREF(ob); |
|
985f8762ee3e
Issue #19437: Fix r_PyLong() of marshal module, stop immediatly at first
Victor Stinner <victor.stinner@gmail.com>
parents:
86484
diff
changeset
|
758 return NULL; |
|
985f8762ee3e
Issue #19437: Fix r_PyLong() of marshal module, stop immediatly at first
Victor Stinner <victor.stinner@gmail.com>
parents:
86484
diff
changeset
|
759 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
760 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
|
761 goto bad_digit; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
762 /* topmost marshal digit should be nonzero */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
763 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
|
764 Py_DECREF(ob); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
765 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
766 "bad marshal data (unnormalized long data)"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
767 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
768 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
769 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
|
770 } |
|
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
|
771 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
|
772 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
|
773 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
|
774 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
775 /* 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
|
776 normalized */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
777 ob->ob_digit[size-1] = d; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
778 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
|
779 bad_digit: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
780 Py_DECREF(ob); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
781 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
782 "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
|
783 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
|
784 } |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
785 |
|
82847
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
786 /* allocate the reflist index for a new object. Return -1 on failure */ |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
787 static Py_ssize_t |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
788 r_ref_reserve(int flag, RFILE *p) |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
789 { |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
790 if (flag) { /* currently only FLAG_REF is defined */ |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
791 Py_ssize_t idx = PyList_GET_SIZE(p->refs); |
|
82847
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
792 if (idx >= 0x7ffffffe) { |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
793 PyErr_SetString(PyExc_ValueError, "bad marshal data (index list too large)"); |
|
82847
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
794 return -1; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
795 } |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
796 if (PyList_Append(p->refs, Py_None) < 0) |
|
82847
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
797 return -1; |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
798 return idx; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
799 } else |
|
82847
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
800 return 0; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
801 } |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
802 |
|
82847
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
803 /* insert the new object 'o' to the reflist at previously |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
804 * allocated index 'idx'. |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
805 * 'o' can be NULL, in which case nothing is done. |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
806 * if 'o' was non-NULL, and the function succeeds, 'o' is returned. |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
807 * if 'o' was non-NULL, and the function fails, 'o' is released and |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
808 * NULL returned. This simplifies error checking at the call site since |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
809 * a single test for NULL for the function result is enough. |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
810 */ |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
811 static PyObject * |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
812 r_ref_insert(PyObject *o, Py_ssize_t idx, int flag, RFILE *p) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
813 { |
|
82847
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
814 if (o != NULL && flag) { /* currently only FLAG_REF is defined */ |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
815 PyObject *tmp = PyList_GET_ITEM(p->refs, idx); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
816 Py_INCREF(o); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
817 PyList_SET_ITEM(p->refs, idx, o); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
818 Py_DECREF(tmp); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
819 } |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
820 return o; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
821 } |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
822 |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
823 /* combination of both above, used when an object can be |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
824 * created whenever it is seen in the file, as opposed to |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
825 * after having loaded its sub-objects. |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
826 */ |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
827 static PyObject * |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
828 r_ref(PyObject *o, int flag, RFILE *p) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
829 { |
|
86810
995173ed248a
Issue #19437: Cleanup r_ref() of the marshal module
Victor Stinner <victor.stinner@gmail.com>
parents:
86809
diff
changeset
|
830 assert(flag & FLAG_REF); |
|
995173ed248a
Issue #19437: Cleanup r_ref() of the marshal module
Victor Stinner <victor.stinner@gmail.com>
parents:
86809
diff
changeset
|
831 if (o == NULL) |
|
995173ed248a
Issue #19437: Cleanup r_ref() of the marshal module
Victor Stinner <victor.stinner@gmail.com>
parents:
86809
diff
changeset
|
832 return NULL; |
|
995173ed248a
Issue #19437: Cleanup r_ref() of the marshal module
Victor Stinner <victor.stinner@gmail.com>
parents:
86809
diff
changeset
|
833 if (PyList_Append(p->refs, o) < 0) { |
|
995173ed248a
Issue #19437: Cleanup r_ref() of the marshal module
Victor Stinner <victor.stinner@gmail.com>
parents:
86809
diff
changeset
|
834 Py_DECREF(o); /* release the new object */ |
|
995173ed248a
Issue #19437: Cleanup r_ref() of the marshal module
Victor Stinner <victor.stinner@gmail.com>
parents:
86809
diff
changeset
|
835 return NULL; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
836 } |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
837 return o; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
838 } |
|
52215
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
839 |
|
bb5de24a343f
Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents:
52171
diff
changeset
|
840 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
841 r_object(RFILE *p) |
| 267 | 842 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
843 /* 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
|
844 an exception is set. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
845 PyObject *v, *v2; |
|
82829
511d17372402
fix compiler warning
Benjamin Peterson <benjamin@python.org>
parents:
82828
diff
changeset
|
846 Py_ssize_t idx = 0; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
847 long i, n; |
|
82848
42bf74b90626
Issue #16475 : Correctly handle the EOF when reading marshal streams.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82847
diff
changeset
|
848 int type, code = r_byte(p); |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
849 int flag, is_interned = 0; |
|
86278
2a2b339b6b59
Issue #19219: retval may be used uninitialized value
Christian Heimes <christian@cheimes.de>
parents:
86262
diff
changeset
|
850 PyObject *retval = NULL; |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41715
diff
changeset
|
851 |
|
82848
42bf74b90626
Issue #16475 : Correctly handle the EOF when reading marshal streams.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82847
diff
changeset
|
852 if (code == EOF) { |
|
42bf74b90626
Issue #16475 : Correctly handle the EOF when reading marshal streams.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82847
diff
changeset
|
853 PyErr_SetString(PyExc_EOFError, |
|
42bf74b90626
Issue #16475 : Correctly handle the EOF when reading marshal streams.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82847
diff
changeset
|
854 "EOF read where object expected"); |
|
42bf74b90626
Issue #16475 : Correctly handle the EOF when reading marshal streams.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82847
diff
changeset
|
855 return NULL; |
|
42bf74b90626
Issue #16475 : Correctly handle the EOF when reading marshal streams.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82847
diff
changeset
|
856 } |
|
42bf74b90626
Issue #16475 : Correctly handle the EOF when reading marshal streams.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82847
diff
changeset
|
857 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
858 p->depth++; |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41715
diff
changeset
|
859 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
860 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
|
861 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
862 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
|
863 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
864 } |
|
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
|
865 |
|
82848
42bf74b90626
Issue #16475 : Correctly handle the EOF when reading marshal streams.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82847
diff
changeset
|
866 flag = code & FLAG_REF; |
|
42bf74b90626
Issue #16475 : Correctly handle the EOF when reading marshal streams.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82847
diff
changeset
|
867 type = code & ~FLAG_REF; |
|
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
|
868 |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
869 #define R_REF(O) do{\ |
|
82847
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
870 if (flag) \ |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
871 O = r_ref(O, flag, p);\ |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
872 } while (0) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
873 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
874 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
|
875 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
876 case TYPE_NULL: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
877 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
|
878 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
879 case TYPE_NONE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
880 Py_INCREF(Py_None); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
881 retval = Py_None; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
882 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
|
883 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
884 case TYPE_STOPITER: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
885 Py_INCREF(PyExc_StopIteration); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
886 retval = PyExc_StopIteration; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
887 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
|
888 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
889 case TYPE_ELLIPSIS: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
890 Py_INCREF(Py_Ellipsis); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
891 retval = Py_Ellipsis; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
892 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
|
893 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
894 case TYPE_FALSE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
895 Py_INCREF(Py_False); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
896 retval = Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
897 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
|
898 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
899 case TYPE_TRUE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
900 Py_INCREF(Py_True); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
901 retval = Py_True; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
902 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
|
903 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
904 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
|
905 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
|
906 retval = PyErr_Occurred() ? NULL : PyLong_FromLong(n); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
907 R_REF(retval); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
908 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
|
909 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
910 case TYPE_LONG: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
911 retval = r_PyLong(p); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
912 R_REF(retval); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
913 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
|
914 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
915 case TYPE_FLOAT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
916 { |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
917 char buf[256], *ptr; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
918 double dx; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
919 n = r_byte(p); |
|
84556
fc7bab8a8618
Issue #17872: Fix a segfault in marshal.load() when input stream returns
Serhiy Storchaka <storchaka@gmail.com>
parents:
84546
diff
changeset
|
920 if (n == EOF) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
921 PyErr_SetString(PyExc_EOFError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
922 "EOF read where object expected"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
923 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
924 } |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
925 ptr = r_string(n, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
926 if (ptr == NULL) |
|
84556
fc7bab8a8618
Issue #17872: Fix a segfault in marshal.load() when input stream returns
Serhiy Storchaka <storchaka@gmail.com>
parents:
84546
diff
changeset
|
927 break; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
928 memcpy(buf, ptr, n); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
929 buf[n] = '\0'; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
930 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
|
931 if (dx == -1.0 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
932 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
933 retval = PyFloat_FromDouble(dx); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
934 R_REF(retval); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
935 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
936 } |
|
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
|
937 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
938 case TYPE_BINARY_FLOAT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
939 { |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
940 unsigned char *buf; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
941 double x; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
942 buf = (unsigned char *) r_string(8, p); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
943 if (buf == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
944 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
945 x = _PyFloat_Unpack8(buf, 1); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
946 if (x == -1.0 && PyErr_Occurred()) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
947 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
948 retval = PyFloat_FromDouble(x); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
949 R_REF(retval); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
950 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
951 } |
| 35008 | 952 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
953 case TYPE_COMPLEX: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
954 { |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
955 char buf[256], *ptr; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
956 Py_complex c; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
957 n = r_byte(p); |
|
84556
fc7bab8a8618
Issue #17872: Fix a segfault in marshal.load() when input stream returns
Serhiy Storchaka <storchaka@gmail.com>
parents:
84546
diff
changeset
|
958 if (n == EOF) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
959 PyErr_SetString(PyExc_EOFError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
960 "EOF read where object expected"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
961 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
962 } |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
963 ptr = r_string(n, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
964 if (ptr == NULL) |
|
84556
fc7bab8a8618
Issue #17872: Fix a segfault in marshal.load() when input stream returns
Serhiy Storchaka <storchaka@gmail.com>
parents:
84546
diff
changeset
|
965 break; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
966 memcpy(buf, ptr, n); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
967 buf[n] = '\0'; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
968 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
|
969 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
|
970 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
971 n = r_byte(p); |
|
84556
fc7bab8a8618
Issue #17872: Fix a segfault in marshal.load() when input stream returns
Serhiy Storchaka <storchaka@gmail.com>
parents:
84546
diff
changeset
|
972 if (n == EOF) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
973 PyErr_SetString(PyExc_EOFError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
974 "EOF read where object expected"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
975 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
976 } |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
977 ptr = r_string(n, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
978 if (ptr == NULL) |
|
84556
fc7bab8a8618
Issue #17872: Fix a segfault in marshal.load() when input stream returns
Serhiy Storchaka <storchaka@gmail.com>
parents:
84546
diff
changeset
|
979 break; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
980 memcpy(buf, ptr, n); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
981 buf[n] = '\0'; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
982 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
|
983 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
|
984 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
985 retval = PyComplex_FromCComplex(c); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
986 R_REF(retval); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
987 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
988 } |
| 35008 | 989 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
990 case TYPE_BINARY_COMPLEX: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
991 { |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
992 unsigned char *buf; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
993 Py_complex c; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
994 buf = (unsigned char *) r_string(8, p); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
995 if (buf == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
996 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
997 c.real = _PyFloat_Unpack8(buf, 1); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
998 if (c.real == -1.0 && PyErr_Occurred()) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
999 break; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1000 buf = (unsigned char *) r_string(8, p); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1001 if (buf == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1002 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1003 c.imag = _PyFloat_Unpack8(buf, 1); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1004 if (c.imag == -1.0 && PyErr_Occurred()) |
|
61467
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 retval = PyComplex_FromCComplex(c); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1007 R_REF(retval); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1008 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1009 } |
|
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
|
1010 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1011 case TYPE_STRING: |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1012 { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1013 char *ptr; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1014 n = r_long(p); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1015 if (PyErr_Occurred()) |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1016 break; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1017 if (n < 0 || n > SIZE32_MAX) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1018 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)"); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1019 break; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1020 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1021 v = PyBytes_FromStringAndSize((char *)NULL, n); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1022 if (v == NULL) |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1023 break; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1024 ptr = r_string(n, p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1025 if (ptr == NULL) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1026 Py_DECREF(v); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1027 break; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1028 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1029 memcpy(PyBytes_AS_STRING(v), ptr, n); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1030 retval = v; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1031 R_REF(retval); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1032 break; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1033 } |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1034 |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1035 case TYPE_ASCII_INTERNED: |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1036 is_interned = 1; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1037 case TYPE_ASCII: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1038 n = r_long(p); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1039 if (PyErr_Occurred()) |
|
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 break; |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
1041 if (n < 0 || n > SIZE32_MAX) { |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1042 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1043 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1044 } |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1045 goto _read_ascii; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1046 |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1047 case TYPE_SHORT_ASCII_INTERNED: |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1048 is_interned = 1; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1049 case TYPE_SHORT_ASCII: |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1050 n = r_byte(p); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1051 if (n == EOF) { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1052 PyErr_SetString(PyExc_EOFError, |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1053 "EOF read where object expected"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1054 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1055 } |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1056 _read_ascii: |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1057 { |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1058 char *ptr; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1059 ptr = r_string(n, p); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1060 if (ptr == NULL) |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1061 break; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1062 v = PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, ptr, n); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1063 if (v == NULL) |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1064 break; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1065 if (is_interned) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1066 PyUnicode_InternInPlace(&v); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1067 retval = v; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1068 R_REF(retval); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1069 break; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1070 } |
|
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
|
1071 |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1072 case TYPE_INTERNED: |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1073 is_interned = 1; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1074 case TYPE_UNICODE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1075 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1076 char *buffer; |
|
11976
513354d87a85
Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents:
9300
diff
changeset
|
1077 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1078 n = r_long(p); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1079 if (PyErr_Occurred()) |
|
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
|
1080 break; |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
1081 if (n < 0 || n > SIZE32_MAX) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1082 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
|
1083 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1084 } |
|
84245
942a7061e8ad
marshal: optimize parsing of empty Unicode strings
Victor Stinner <victor.stinner@gmail.com>
parents:
83313
diff
changeset
|
1085 if (n != 0) { |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1086 buffer = r_string(n, p); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1087 if (buffer == NULL) |
|
84245
942a7061e8ad
marshal: optimize parsing of empty Unicode strings
Victor Stinner <victor.stinner@gmail.com>
parents:
83313
diff
changeset
|
1088 break; |
|
942a7061e8ad
marshal: optimize parsing of empty Unicode strings
Victor Stinner <victor.stinner@gmail.com>
parents:
83313
diff
changeset
|
1089 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1090 } |
|
84245
942a7061e8ad
marshal: optimize parsing of empty Unicode strings
Victor Stinner <victor.stinner@gmail.com>
parents:
83313
diff
changeset
|
1091 else { |
|
942a7061e8ad
marshal: optimize parsing of empty Unicode strings
Victor Stinner <victor.stinner@gmail.com>
parents:
83313
diff
changeset
|
1092 v = PyUnicode_New(0, 0); |
|
942a7061e8ad
marshal: optimize parsing of empty Unicode strings
Victor Stinner <victor.stinner@gmail.com>
parents:
83313
diff
changeset
|
1093 } |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1094 if (v == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1095 break; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1096 if (is_interned) |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1097 PyUnicode_InternInPlace(&v); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1098 retval = v; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1099 R_REF(retval); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1100 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1101 } |
|
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
|
1102 |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1103 case TYPE_SMALL_TUPLE: |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1104 n = (unsigned char) r_byte(p); |
|
86808
9e836a945ea9
Issue #19437: Fix r_object() of marshal module, handle r_byte() failure for
Victor Stinner <victor.stinner@gmail.com>
parents:
86807
diff
changeset
|
1105 if (PyErr_Occurred()) |
|
9e836a945ea9
Issue #19437: Fix r_object() of marshal module, handle r_byte() failure for
Victor Stinner <victor.stinner@gmail.com>
parents:
86807
diff
changeset
|
1106 break; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1107 goto _read_tuple; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1108 case TYPE_TUPLE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1109 n = r_long(p); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1110 if (PyErr_Occurred()) |
|
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
|
1111 break; |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
1112 if (n < 0 || n > SIZE32_MAX) { |
|
61467
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 (tuple size out of range)"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1114 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1115 } |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1116 _read_tuple: |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
1117 v = PyTuple_New(n); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1118 R_REF(v); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1119 if (v == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1120 break; |
|
86809
fc54e2848c98
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
86808
diff
changeset
|
1121 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1122 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1123 v2 = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1124 if ( v2 == NULL ) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1125 if (!PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1126 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1127 "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
|
1128 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1129 v = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1130 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1131 } |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
1132 PyTuple_SET_ITEM(v, i, v2); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1133 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1134 retval = v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1135 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
|
1136 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1137 case TYPE_LIST: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1138 n = r_long(p); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1139 if (PyErr_Occurred()) |
|
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
|
1140 break; |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
1141 if (n < 0 || n > SIZE32_MAX) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1142 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
|
1143 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1144 } |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
1145 v = PyList_New(n); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1146 R_REF(v); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1147 if (v == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1148 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1149 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1150 v2 = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1151 if ( v2 == NULL ) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1152 if (!PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1153 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1154 "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
|
1155 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1156 v = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1157 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1158 } |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
1159 PyList_SET_ITEM(v, i, v2); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1160 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1161 retval = v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1162 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
|
1163 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1164 case TYPE_DICT: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1165 v = PyDict_New(); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1166 R_REF(v); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1167 if (v == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1168 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1169 for (;;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1170 PyObject *key, *val; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1171 key = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1172 if (key == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1173 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1174 val = r_object(p); |
|
86809
fc54e2848c98
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
86808
diff
changeset
|
1175 if (val == NULL) { |
|
fc54e2848c98
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
86808
diff
changeset
|
1176 Py_DECREF(key); |
|
fc54e2848c98
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
86808
diff
changeset
|
1177 break; |
|
fc54e2848c98
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
86808
diff
changeset
|
1178 } |
|
fc54e2848c98
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
86808
diff
changeset
|
1179 if (PyDict_SetItem(v, key, val) < 0) { |
|
fc54e2848c98
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
86808
diff
changeset
|
1180 Py_DECREF(key); |
|
fc54e2848c98
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
86808
diff
changeset
|
1181 Py_DECREF(val); |
|
fc54e2848c98
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
86808
diff
changeset
|
1182 break; |
|
fc54e2848c98
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
86808
diff
changeset
|
1183 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1184 Py_DECREF(key); |
|
86809
fc54e2848c98
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
86808
diff
changeset
|
1185 Py_DECREF(val); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1186 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1187 if (PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1188 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1189 v = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1190 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1191 retval = v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1192 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
|
1193 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1194 case TYPE_SET: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1195 case TYPE_FROZENSET: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1196 n = r_long(p); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1197 if (PyErr_Occurred()) |
|
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
|
1198 break; |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
1199 if (n < 0 || n > SIZE32_MAX) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1200 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
|
1201 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1202 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1203 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL); |
|
82847
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
1204 if (type == TYPE_SET) { |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1205 R_REF(v); |
|
82847
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
1206 } else { |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
1207 /* must use delayed registration of frozensets because they must |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
1208 * be init with a refcount of 1 |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
1209 */ |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
1210 idx = r_ref_reserve(flag, p); |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
1211 if (idx < 0) |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
1212 Py_CLEAR(v); /* signal error */ |
|
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
1213 } |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1214 if (v == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1215 break; |
|
86809
fc54e2848c98
Issue #19437: Fix r_object() of marshal module, handle PyDict_SetItem() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
86808
diff
changeset
|
1216 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1217 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1218 v2 = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1219 if ( v2 == NULL ) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1220 if (!PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1221 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1222 "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
|
1223 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1224 v = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1225 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1226 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1227 if (PySet_Add(v, v2) == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1228 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1229 Py_DECREF(v2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1230 v = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1231 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1232 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1233 Py_DECREF(v2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1234 } |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1235 if (type != TYPE_SET) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1236 v = r_ref_insert(v, idx, flag, p); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1237 retval = v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1238 break; |
|
34394
b480abaf1f6f
SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents:
34205
diff
changeset
|
1239 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1240 case TYPE_CODE: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1241 { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1242 int argcount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1243 int kwonlyargcount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1244 int nlocals; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1245 int stacksize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1246 int flags; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1247 PyObject *code = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1248 PyObject *consts = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1249 PyObject *names = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1250 PyObject *varnames = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1251 PyObject *freevars = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1252 PyObject *cellvars = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1253 PyObject *filename = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1254 PyObject *name = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1255 int firstlineno; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1256 PyObject *lnotab = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1257 |
|
82847
f4c21179690b
Issue #16475: Simplify the interface to r_ref_allocate and improve comments.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82829
diff
changeset
|
1258 idx = r_ref_reserve(flag, p); |
|
86301
500b4b62c19a
Issue #19219 Remove a lot of "retval = NULL" statements, now that retval
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86278
diff
changeset
|
1259 if (idx < 0) |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1260 break; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1261 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1262 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
|
1263 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1264 /* 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
|
1265 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
|
1266 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
|
1267 goto code_error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1268 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
|
1269 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
|
1270 goto code_error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1271 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
|
1272 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
|
1273 goto code_error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1274 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
|
1275 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
|
1276 goto code_error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1277 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
|
1278 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
|
1279 goto code_error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1280 code = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1281 if (code == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1282 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1283 consts = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1284 if (consts == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1285 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1286 names = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1287 if (names == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1288 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1289 varnames = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1290 if (varnames == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1291 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1292 freevars = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1293 if (freevars == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1294 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1295 cellvars = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1296 if (cellvars == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1297 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1298 filename = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1299 if (filename == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1300 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
|
1301 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
|
1302 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
|
1303 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
|
1304 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
|
1305 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
|
1306 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
|
1307 } |
|
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
|
1308 } |
|
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
|
1309 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
|
1310 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
|
1311 } |
|
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
|
1312 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1313 name = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1314 if (name == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1315 goto code_error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1316 firstlineno = (int)r_long(p); |
|
86310
d6d340549c80
Catch a few extra error cases in marshal.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86301
diff
changeset
|
1317 if (firstlineno == -1 && PyErr_Occurred()) |
|
d6d340549c80
Catch a few extra error cases in marshal.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86301
diff
changeset
|
1318 break; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1319 lnotab = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1320 if (lnotab == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1321 goto code_error; |
| 35008 | 1322 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1323 v = (PyObject *) PyCode_New( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1324 argcount, kwonlyargcount, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1325 nlocals, stacksize, flags, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1326 code, consts, names, varnames, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1327 freevars, cellvars, filename, name, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1328 firstlineno, lnotab); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1329 v = r_ref_insert(v, idx, flag, p); |
| 35008 | 1330 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1331 code_error: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1332 Py_XDECREF(code); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1333 Py_XDECREF(consts); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1334 Py_XDECREF(names); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1335 Py_XDECREF(varnames); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1336 Py_XDECREF(freevars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1337 Py_XDECREF(cellvars); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1338 Py_XDECREF(filename); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1339 Py_XDECREF(name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1340 Py_XDECREF(lnotab); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1341 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1342 retval = v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1343 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
|
1344 |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1345 case TYPE_REF: |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1346 n = r_long(p); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1347 if (n < 0 || n >= PyList_GET_SIZE(p->refs)) { |
|
86310
d6d340549c80
Catch a few extra error cases in marshal.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86301
diff
changeset
|
1348 if (n == -1 && PyErr_Occurred()) |
|
d6d340549c80
Catch a few extra error cases in marshal.c
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
86301
diff
changeset
|
1349 break; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1350 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)"); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1351 break; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1352 } |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1353 v = PyList_GET_ITEM(p->refs, n); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1354 if (v == Py_None) { |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1355 PyErr_SetString(PyExc_ValueError, "bad marshal data (invalid reference)"); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1356 break; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1357 } |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1358 Py_INCREF(v); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1359 retval = v; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1360 break; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1361 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1362 default: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1363 /* 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
|
1364 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
|
1365 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
|
1366 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
|
1367 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1368 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1369 p->depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1370 return retval; |
| 267 | 1371 } |
| 1372 | |
|
32343
54b257e55f99
Make private function static
Neal Norwitz <nnorwitz@gmail.com>
parents:
32305
diff
changeset
|
1373 static PyObject * |
|
31824
331de8b9d1ed
Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents:
30311
diff
changeset
|
1374 read_object(RFILE *p) |
|
331de8b9d1ed
Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents:
30311
diff
changeset
|
1375 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1376 PyObject *v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1377 if (PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1378 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
|
1379 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1380 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1381 v = r_object(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1382 if (v == NULL && !PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1383 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
|
1384 return v; |
|
31824
331de8b9d1ed
Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents:
30311
diff
changeset
|
1385 } |
|
331de8b9d1ed
Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents:
30311
diff
changeset
|
1386 |
|
20552
65dd6157f999
SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents:
19605
diff
changeset
|
1387 int |
|
65dd6157f999
SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents:
19605
diff
changeset
|
1388 PyMarshal_ReadShortFromFile(FILE *fp) |
|
65dd6157f999
SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents:
19605
diff
changeset
|
1389 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1390 RFILE rf; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1391 int res; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1392 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
|
1393 rf.readable = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1394 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
|
1395 rf.current_filename = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1396 rf.end = rf.ptr = NULL; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1397 rf.buf = NULL; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1398 res = r_short(&rf); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1399 if (rf.buf != NULL) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1400 PyMem_FREE(rf.buf); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1401 return res; |
|
20552
65dd6157f999
SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents:
19605
diff
changeset
|
1402 } |
|
65dd6157f999
SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents:
19605
diff
changeset
|
1403 |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1404 long |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
1405 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
|
1406 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1407 RFILE rf; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1408 long res; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1409 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
|
1410 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
|
1411 rf.current_filename = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1412 rf.ptr = rf.end = NULL; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1413 rf.buf = NULL; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1414 res = r_long(&rf); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1415 if (rf.buf != NULL) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1416 PyMem_FREE(rf.buf); |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1417 return res; |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1418 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1419 |
|
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
|
1420 #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
|
1421 /* 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
|
1422 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
|
1423 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
|
1424 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1425 struct stat st; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1426 if (fstat(fileno(fp), &st) != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1427 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1428 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1429 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
|
1430 } |
|
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
|
1431 #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
|
1432 |
|
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
|
1433 /* 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
|
1434 * 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
|
1435 * 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
|
1436 * 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
|
1437 * 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
|
1438 */ |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1439 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
|
1440 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
|
1441 { |
|
60825
92a633a30acb
Merged revisions 80325 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56594
diff
changeset
|
1442 /* 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
|
1443 #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
|
1444 #ifdef HAVE_FSTAT |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1445 off_t filesize; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1446 filesize = getfilesize(fp); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60825
diff
changeset
|
1447 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
|
1448 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
|
1449 if (pBuf != NULL) { |
|
82190
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
1450 size_t n = fread(pBuf, 1, (size_t)filesize, fp); |
|
e0464fa28c85
Issue #5308: Raise ValueError when marshalling too large object (a sequence
Serhiy Storchaka <storchaka@gmail.com>
parents:
75374
diff
changeset
|
1451 PyObject* v = PyMarshal_ReadObjectFromString(pBuf, n); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
60825
diff
changeset
|
1452 PyMem_FREE(pBuf); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1453 return v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1454 } |
|
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
|
1455 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1456 } |
|
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
|
1457 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1458 /* 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
|
1459 * 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
|
1460 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1461 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
|
1462 |
|
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
|
1463 #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
|
1464 } |
|
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
|
1465 |
|
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
|
1466 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
|
1467 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
|
1468 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1469 RFILE rf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1470 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1471 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
|
1472 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
|
1473 rf.current_filename = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1474 rf.depth = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1475 rf.ptr = rf.end = NULL; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1476 rf.buf = NULL; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1477 rf.refs = PyList_New(0); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1478 if (rf.refs == NULL) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1479 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1480 result = r_object(&rf); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1481 Py_DECREF(rf.refs); |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1482 if (rf.buf != NULL) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1483 PyMem_FREE(rf.buf); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1484 return result; |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1485 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1486 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1487 PyObject * |
|
86484
3055e61f1e66
Issue #1772673: The type of `char*` arguments now changed to `const char*`.
Serhiy Storchaka <storchaka@gmail.com>
parents:
86376
diff
changeset
|
1488 PyMarshal_ReadObjectFromString(const 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
|
1489 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1490 RFILE rf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1491 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1492 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
|
1493 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
|
1494 rf.current_filename = NULL; |
|
86484
3055e61f1e66
Issue #1772673: The type of `char*` arguments now changed to `const char*`.
Serhiy Storchaka <storchaka@gmail.com>
parents:
86376
diff
changeset
|
1495 rf.ptr = (char *)str; |
|
3055e61f1e66
Issue #1772673: The type of `char*` arguments now changed to `const char*`.
Serhiy Storchaka <storchaka@gmail.com>
parents:
86376
diff
changeset
|
1496 rf.end = (char *)str + len; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1497 rf.buf = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1498 rf.depth = 0; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1499 rf.refs = PyList_New(0); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1500 if (rf.refs == NULL) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1501 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1502 result = r_object(&rf); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1503 Py_DECREF(rf.refs); |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1504 if (rf.buf != NULL) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1505 PyMem_FREE(rf.buf); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1506 return result; |
|
1270
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1507 } |
|
14369a5e6167
Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents:
1257
diff
changeset
|
1508 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1509 PyObject * |
|
32422
3df36e2e5ddc
Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents:
32343
diff
changeset
|
1510 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
|
1511 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1512 WFILE wf; |
|
41653
52533370f1ad
Make test_marshal pass. Not my best work. :-(
Guido van Rossum <guido@python.org>
parents:
41595
diff
changeset
|
1513 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1514 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
|
1515 wf.readable = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1516 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
|
1517 if (wf.str == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1518 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1519 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
|
1520 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
|
1521 wf.error = WFERR_OK; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1522 wf.depth = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1523 wf.version = version; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1524 if (version >= 3) { |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1525 if ((wf.refs = PyDict_New()) == NULL) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1526 return NULL; |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1527 } else |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1528 wf.refs = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1529 w_object(x, &wf); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1530 Py_XDECREF(wf.refs); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1531 if (wf.str != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1532 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
|
1533 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
|
1534 Py_DECREF(wf.str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1535 PyErr_SetString(PyExc_OverflowError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1536 "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
|
1537 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1538 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1539 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
|
1540 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1541 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1542 if (wf.error != WFERR_OK) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1543 Py_XDECREF(wf.str); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1544 if (wf.error == WFERR_NOMEMORY) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1545 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1546 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1547 PyErr_SetString(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1548 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1549 :"object too deeply nested to marshal"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1550 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1551 } |
|
75371
61661842f225
Simplify code in marshal.c.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75370
diff
changeset
|
1552 return wf.str; |
|
4039
23f280ab5409
Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents:
3839
diff
changeset
|
1553 } |
|
23f280ab5409
Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents:
3839
diff
changeset
|
1554 |
|
279
9c924f9c3b16
Add marshalling for dictionaries.
Guido van Rossum <guido@python.org>
parents:
272
diff
changeset
|
1555 /* And an interface for Python programs... */ |
| 267 | 1556 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1557 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
1558 marshal_dump(PyObject *self, PyObject *args) |
| 267 | 1559 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1560 /* 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
|
1561 PyObject *x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1562 PyObject *f; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1563 int version = Py_MARSHAL_VERSION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1564 PyObject *s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1565 PyObject *res; |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
1566 _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
|
1567 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1568 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
|
1569 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1570 s = PyMarshal_WriteObjectToString(x, version); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1571 if (s == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1572 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
|
1573 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
|
1574 Py_DECREF(s); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1575 return res; |
| 267 | 1576 } |
| 1577 | |
|
54035
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1578 PyDoc_STRVAR(dump_doc, |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1579 "dump(value, file[, version])\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1580 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1581 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
|
1582 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
|
1583 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
|
1584 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1585 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
|
1586 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
|
1587 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
|
1588 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1589 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
|
1590 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1591 static PyObject * |
|
38490
a5298f371be7
Convert more modules to METH_VARARGS.
Georg Brandl <georg@python.org>
parents:
36866
diff
changeset
|
1592 marshal_load(PyObject *self, PyObject *f) |
| 267 | 1593 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1594 PyObject *data, *result; |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72835
diff
changeset
|
1595 _Py_IDENTIFIER(read); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1596 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
|
1597 |
|
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
|
1598 /* |
|
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
|
1599 * 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
|
1600 * 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
|
1601 * has a read method which returns bytes. |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1602 * This can be removed if we guarantee good error handling |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1603 * for r_string() |
|
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
|
1604 */ |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72475
diff
changeset
|
1605 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
|
1606 if (data == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1607 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
|
1608 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
|
1609 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
|
1610 "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
|
1611 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
|
1612 result = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1613 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1614 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
|
1615 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
|
1616 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
|
1617 rf.readable = f; |
|
71136
42193f3ffc94
Correct uninitialized data problem in marshal code.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents:
71135
diff
changeset
|
1618 rf.current_filename = NULL; |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1619 rf.ptr = rf.end = NULL; |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1620 rf.buf = NULL; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1621 if ((rf.refs = PyList_New(0)) != NULL) { |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1622 result = read_object(&rf); |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1623 Py_DECREF(rf.refs); |
|
86255
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1624 if (rf.buf != NULL) |
|
4059e871e74e
Issue #19219: Speed up marshal.loads(), and make pyc files slightly (5% to 10%) smaller.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85419
diff
changeset
|
1625 PyMem_FREE(rf.buf); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1626 } else |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1627 result = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1628 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1629 Py_DECREF(data); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1630 return result; |
|
1191
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1631 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1632 |
|
54035
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1633 PyDoc_STRVAR(load_doc, |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1634 "load(file)\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1635 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1636 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
|
1637 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
|
1638 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
|
1639 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
|
1640 'r+b').\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1641 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1642 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
|
1643 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
|
1644 |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1645 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1646 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
1647 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
|
1648 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1649 PyObject *x; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1650 int version = Py_MARSHAL_VERSION; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1651 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
|
1652 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1653 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
|
1654 } |
|
38f0054f44a7
Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents:
795
diff
changeset
|
1655 |
|
54035
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1656 PyDoc_STRVAR(dumps_doc, |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1657 "dumps(value[, version])\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1658 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1659 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
|
1660 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
|
1661 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
|
1662 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1663 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
|
1664 |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1665 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1666 static PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
1667 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
|
1668 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1669 RFILE rf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1670 Py_buffer p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1671 char *s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1672 Py_ssize_t n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1673 PyObject* result; |
|
75374
4966907d3661
Issue #14177: marshal.loads() now raises TypeError when given an unicode string.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75369
diff
changeset
|
1674 if (!PyArg_ParseTuple(args, "y*:loads", &p)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1675 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1676 s = p.buf; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1677 n = p.len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1678 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
|
1679 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
|
1680 rf.current_filename = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1681 rf.ptr = s; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1682 rf.end = s + n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1683 rf.depth = 0; |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1684 if ((rf.refs = PyList_New(0)) == NULL) |
|
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1685 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1686 result = read_object(&rf); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1687 PyBuffer_Release(&p); |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1688 Py_DECREF(rf.refs); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1689 return result; |
| 267 | 1690 } |
| 1691 | |
|
54035
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1692 PyDoc_STRVAR(loads_doc, |
|
75374
4966907d3661
Issue #14177: marshal.loads() now raises TypeError when given an unicode string.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75369
diff
changeset
|
1693 "loads(bytes)\n\ |
|
54035
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1694 \n\ |
|
75374
4966907d3661
Issue #14177: marshal.loads() now raises TypeError when given an unicode string.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75369
diff
changeset
|
1695 Convert the bytes object to a value. If no valid value is found, raise\n\ |
|
4966907d3661
Issue #14177: marshal.loads() now raises TypeError when given an unicode string.
Antoine Pitrou <solipsis@pitrou.net>
parents:
75369
diff
changeset
|
1696 EOFError, ValueError or TypeError. Extra characters in the input are\n\ |
|
54035
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1697 ignored."); |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1698 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
1699 static PyMethodDef marshal_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1700 {"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
|
1701 {"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
|
1702 {"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
|
1703 {"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
|
1704 {NULL, NULL} /* sentinel */ |
| 267 | 1705 }; |
| 1706 | |
|
54035
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1707 |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1708 PyDoc_STRVAR(module_doc, |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1709 "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
|
1710 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
|
1711 machine architecture issues.\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1712 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1713 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
|
1714 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
|
1715 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
|
1716 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
|
1717 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
|
1718 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
|
1719 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
|
1720 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
|
1721 (they will cause infinite loops).\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1722 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1723 Variables:\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1724 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1725 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
|
1726 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
|
1727 uses a binary format for floating point numbers.\n\ |
|
82816
01372117a5b4
Issue #16475: Support object instancing, recursion and interned strings
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
82191
diff
changeset
|
1728 Version 3 shares common object references (New in version 3.4).\n\ |
|
54035
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1729 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1730 Functions:\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1731 \n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1732 dump() -- write value to a file\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1733 load() -- read value from a file\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1734 dumps() -- write value to a string\n\ |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1735 loads() -- read value from a string"); |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1736 |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1737 |
|
19e959626109
Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents:
53965
diff
changeset
|
1738 |
|
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
|
1739 static struct PyModuleDef marshalmodule = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1740 PyModuleDef_HEAD_INIT, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1741 "marshal", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1742 module_doc, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1743 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1744 marshal_methods, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1745 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1746 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1747 NULL, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1748 NULL |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47343
diff
changeset
|
1749 }; |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
47343
diff
changeset
|
1750 |
|
30311
f003e48f562d
Bug #794140: cygwin builds do not embed
Jason Tishler <jason@tishler.net>
parents:
24435
diff
changeset
|
1751 PyMODINIT_FUNC |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13447
diff
changeset
|
1752 PyMarshal_Init(void) |
| 267 | 1753 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1754 PyObject *mod = PyModule_Create(&marshalmodule); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1755 if (mod == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1756 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
56297
diff
changeset
|
1757 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
|
1758 return mod; |
| 267 | 1759 } |
