annotate Python/marshal.c @ 58664:993f703a61ba

Merged revisions 77484,77487,77561,77570,77593,77603,77608,77667,77702-77703,77739,77858,77887,77889 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r77484 | skip.montanaro | 2010-01-13 19:12:34 -0600 (Wed, 13 Jan 2010) | 4 lines Update PyEval_EvalFrame to PyEval_EvalFrameEx. This looks to have been done partially before. Also add a comment describing how this might have to work with different versions of the interpreter. ........ r77487 | ezio.melotti | 2010-01-14 05:34:10 -0600 (Thu, 14 Jan 2010) | 1 line Fixed typo ........ r77561 | georg.brandl | 2010-01-17 02:42:30 -0600 (Sun, 17 Jan 2010) | 1 line #7699: improve datetime docs: straightforward linking to strftime/strptime section, mark classmethods as such. ........ r77570 | georg.brandl | 2010-01-17 06:14:42 -0600 (Sun, 17 Jan 2010) | 1 line Add note about usage of STRINGLIB_EMPTY. ........ r77593 | georg.brandl | 2010-01-17 17:33:53 -0600 (Sun, 17 Jan 2010) | 1 line Fix internal reference. ........ r77603 | benjamin.peterson | 2010-01-18 17:07:56 -0600 (Mon, 18 Jan 2010) | 8 lines data descriptors do not override the class dictionary if __get__ is not defined Adjust documentation and add a test to verify this behavior. See http://mail.python.org/pipermail/python-dev/2010-January/095637.html for discussion. ........ r77608 | gregory.p.smith | 2010-01-19 02:19:03 -0600 (Tue, 19 Jan 2010) | 6 lines Do not compile stubs for the sha2 series hashes in the openssl hashlib module when the openssl version is too old to support them. That leads both compiled code bloat and to unittests attempting to test implementations that don't exist for comparison purposes on such platforms. ........ r77667 | mark.dickinson | 2010-01-21 12:32:27 -0600 (Thu, 21 Jan 2010) | 1 line Add two more test_strtod test values. ........ r77702 | georg.brandl | 2010-01-23 02:43:31 -0600 (Sat, 23 Jan 2010) | 1 line #7762: fix refcount annotation of PyUnicode_Tailmatch(). ........ r77703 | georg.brandl | 2010-01-23 02:47:54 -0600 (Sat, 23 Jan 2010) | 1 line #7725: fix referencing issue. ........ r77739 | benjamin.peterson | 2010-01-24 21:52:52 -0600 (Sun, 24 Jan 2010) | 1 line mention from_float() in error message ........ r77858 | georg.brandl | 2010-01-30 11:57:48 -0600 (Sat, 30 Jan 2010) | 1 line #7802: fix invalid example (heh). ........ r77887 | georg.brandl | 2010-01-31 12:51:49 -0600 (Sun, 31 Jan 2010) | 5 lines Fix-up ftplib documentation: move exception descriptions to toplevel, not inside a class remove attribution in "versionadded" spell and grammar check docstring of FTP_TLS ........ r77889 | michael.foord | 2010-01-31 13:59:26 -0600 (Sun, 31 Jan 2010) | 1 line Minor modification to unittest documentation. ........
author Benjamin Peterson <benjamin@python.org>
date Wed, 03 Feb 2010 02:35:45 +0000
parents 0f9e8d3ecac3
children 92a633a30acb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Write Python objects to files and read them back.
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 This is intended for writing and reading compiled Python code only;
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 a true persistent storage facility would be much harder, since
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 it would have to take circular links and sharing into account. */
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
36792
688795873ff1 Make Py_ssize_t clean.
Thomas Wouters <thomas@python.org>
parents: 36784
diff changeset
7 #define PY_SSIZE_T_CLEAN
688795873ff1 Make Py_ssize_t clean.
Thomas Wouters <thomas@python.org>
parents: 36784
diff changeset
8
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
9 #include "Python.h"
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 #include "longintrepr.h"
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35346
diff changeset
11 #include "code.h"
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 #include "marshal.h"
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13
52215
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
14 #define ABS(x) ((x) < 0 ? -(x) : (x))
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
15
13070
7392e71f6cce Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
16 /* High water mark to determine when the marshalled object is dangerously deep
7392e71f6cce Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
17 * and risks coring the interpreter. When the object stack gets this deep,
7392e71f6cce Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
18 * raise an exception instead of continuing.
43007
5fde5d6964d7 [Oops, I forgot half of the patch.]
Guido van Rossum <guido@python.org>
parents: 42665
diff changeset
19 * On Windows debug builds, reduce this value.
13070
7392e71f6cce Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
20 */
43007
5fde5d6964d7 [Oops, I forgot half of the patch.]
Guido van Rossum <guido@python.org>
parents: 42665
diff changeset
21 #if defined(MS_WINDOWS) && defined(_DEBUG)
5fde5d6964d7 [Oops, I forgot half of the patch.]
Guido van Rossum <guido@python.org>
parents: 42665
diff changeset
22 #define MAX_MARSHAL_STACK_DEPTH 1500
5fde5d6964d7 [Oops, I forgot half of the patch.]
Guido van Rossum <guido@python.org>
parents: 42665
diff changeset
23 #else
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
24 #define MAX_MARSHAL_STACK_DEPTH 2000
43007
5fde5d6964d7 [Oops, I forgot half of the patch.]
Guido van Rossum <guido@python.org>
parents: 42665
diff changeset
25 #endif
13070
7392e71f6cce Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
26
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
27 #define TYPE_NULL '0'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
28 #define TYPE_NONE 'N'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
29 #define TYPE_FALSE 'F'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
30 #define TYPE_TRUE 'T'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
31 #define TYPE_STOPITER 'S'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
32 #define TYPE_ELLIPSIS '.'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
33 #define TYPE_INT 'i'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
34 #define TYPE_INT64 'I'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
35 #define TYPE_FLOAT 'f'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
36 #define TYPE_BINARY_FLOAT 'g'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
37 #define TYPE_COMPLEX 'x'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
38 #define TYPE_BINARY_COMPLEX 'y'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
39 #define TYPE_LONG 'l'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
40 #define TYPE_STRING 's'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
41 #define TYPE_TUPLE '('
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
42 #define TYPE_LIST '['
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
43 #define TYPE_DICT '{'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
44 #define TYPE_CODE 'c'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
45 #define TYPE_UNICODE 'u'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
46 #define TYPE_UNKNOWN '?'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
47 #define TYPE_SET '<'
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
48 #define TYPE_FROZENSET '>'
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49
53300
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
50 #define WFERR_OK 0
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
51 #define WFERR_UNMARSHALLABLE 1
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
52 #define WFERR_NESTEDTOODEEP 2
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
53 #define WFERR_NOMEMORY 3
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
54
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
55 typedef struct {
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
56 FILE *fp;
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
57 int error; /* see WFERR_* values */
13070
7392e71f6cce Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
58 int depth;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
59 /* If fp == NULL, the following are valid: */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
60 PyObject *str;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
61 char *ptr;
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
62 char *end;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
63 PyObject *strings; /* dict on marshal, list on unmarshal */
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
64 int version;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
65 } WFILE;
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
66
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
67 #define w_byte(c, p) if (((p)->fp)) putc((c), (p)->fp); \
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
68 else if ((p)->ptr != (p)->end) *(p)->ptr++ = (c); \
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
69 else w_more(c, p)
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
71 static void
13672
bfc5b2a8c11f -- changed w_more to take an integer instead of a char
Fredrik Lundh <fredrik@pythonware.com>
parents: 13658
diff changeset
72 w_more(int c, WFILE *p)
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
73 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
74 Py_ssize_t size, newsize;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
75 if (p->str == NULL)
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
76 return; /* An error already occurred */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
77 size = PyBytes_Size(p->str);
47067
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 45082
diff changeset
78 newsize = size + size + 1024;
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 45082
diff changeset
79 if (newsize > 32*1024*1024) {
48321
f6726f32ef70 Merged revisions 64119,64147,64150,64165,64219-64221,64229-64230,64233,64235,64253,64278,64280,64301,64303,64320,64328,64338-64339 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47580
diff changeset
80 newsize = size + (size >> 3); /* 12.5% overallocation */
47067
960ade856078 Merged revisions 62998-63003,63005-63006,63009-63012,63014-63017,63019-63020,63022-63024,63026-63029,63031-63041,63043-63045,63047-63054,63056-63062 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 45082
diff changeset
81 }
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
82 if (_PyBytes_Resize(&p->str, newsize) != 0) {
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
83 p->ptr = p->end = NULL;
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
84 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
85 else {
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
86 p->ptr = PyBytes_AS_STRING((PyBytesObject *)p->str) + size;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
87 p->end =
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
88 PyBytes_AS_STRING((PyBytesObject *)p->str) + newsize;
13674
c90d94d287d7 Included assert.h in Python.h -- it's absurd that this basic tool of
Tim Peters <tim.peters@gmail.com>
parents: 13672
diff changeset
89 *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
90 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
91 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
92
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
93 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
94 w_string(char *s, int n, WFILE *p)
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
95 {
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
96 if (p->fp != NULL) {
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
97 fwrite(s, 1, n, p->fp);
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
98 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
99 else {
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
100 while (--n >= 0) {
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
101 w_byte(*s, p);
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
102 s++;
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
103 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
104 }
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
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
108 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
109 {
24434
9ef82377669d Fix SF 588452: debug build crashes on marshal.dumps([128] * 1000).
Thomas Heller <theller@ctypes.org>
parents: 23851
diff changeset
110 w_byte((char)( x & 0xff), p);
9ef82377669d Fix SF 588452: debug build crashes on marshal.dumps([128] * 1000).
Thomas Heller <theller@ctypes.org>
parents: 23851
diff changeset
111 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
112 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
113
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
114 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
115 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
116 {
24435
7dc3f4077e59 Whitespace normalization.
Thomas Heller <theller@ctypes.org>
parents: 24434
diff changeset
117 w_byte((char)( x & 0xff), p);
7dc3f4077e59 Whitespace normalization.
Thomas Heller <theller@ctypes.org>
parents: 24434
diff changeset
118 w_byte((char)((x>> 8) & 0xff), p);
7dc3f4077e59 Whitespace normalization.
Thomas Heller <theller@ctypes.org>
parents: 24434
diff changeset
119 w_byte((char)((x>>16) & 0xff), p);
7dc3f4077e59 Whitespace normalization.
Thomas Heller <theller@ctypes.org>
parents: 24434
diff changeset
120 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
121 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
122
4656
186c2ad4abf3 Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4592
diff changeset
123 #if SIZEOF_LONG > 4
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
124 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
125 w_long64(long x, WFILE *p)
4592
3bf9e2beaf8c Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
126 {
3bf9e2beaf8c Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
127 w_long(x, p);
4656
186c2ad4abf3 Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4592
diff changeset
128 w_long(x>>32, p);
4592
3bf9e2beaf8c Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
129 }
4656
186c2ad4abf3 Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4592
diff changeset
130 #endif
4592
3bf9e2beaf8c Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
131
52215
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
132 /* We assume that Python longs are stored internally in base some power of
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
133 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
134 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
135
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
136 #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
137 #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
138 #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
139 #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
140 #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
141 #endif
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
142 #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
143
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
144 static void
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
145 w_PyLong(const PyLongObject *ob, WFILE *p)
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
146 {
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
147 Py_ssize_t i, j, n, l;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
148 digit d;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
149
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
150 w_byte(TYPE_LONG, p);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
151 if (Py_SIZE(ob) == 0) {
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
152 w_long((long)0, p);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
153 return;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
154 }
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
155
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
156 /* set l to number of base PyLong_MARSHAL_BASE digits */
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
157 n = ABS(Py_SIZE(ob));
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
158 l = (n-1) * PyLong_MARSHAL_RATIO;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
159 d = ob->ob_digit[n-1];
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
160 assert(d != 0); /* a PyLong is always normalized */
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
161 do {
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
162 d >>= 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
163 l++;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
164 } while (d != 0);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
165 w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
166
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
167 for (i=0; i < n-1; i++) {
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
168 d = ob->ob_digit[i];
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
169 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
170 w_short(d & PyLong_MARSHAL_MASK, p);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
171 d >>= 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 }
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
173 assert (d == 0);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
174 }
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
175 d = ob->ob_digit[n-1];
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
176 do {
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
177 w_short(d & PyLong_MARSHAL_MASK, p);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
178 d >>= 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
179 } while (d != 0);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
180 }
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
181
4592
3bf9e2beaf8c Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
182 static void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
183 w_object(PyObject *v, WFILE *p)
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
185 Py_ssize_t i, n;
13070
7392e71f6cce Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
186
7392e71f6cce Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
187 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
188
13070
7392e71f6cce Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
189 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
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
190 p->error = WFERR_NESTEDTOODEEP;
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
191 }
13070
7392e71f6cce Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
192 else if (v == NULL) {
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
193 w_byte(TYPE_NULL, p);
7982
a909a2869ac5 Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 5905
diff changeset
194 }
a909a2869ac5 Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 5905
diff changeset
195 else if (v == Py_None) {
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
196 w_byte(TYPE_NONE, p);
7982
a909a2869ac5 Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 5905
diff changeset
197 }
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
198 else if (v == PyExc_StopIteration) {
7bc473b2c654 Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents: 17707
diff changeset
199 w_byte(TYPE_STOPITER, p);
7bc473b2c654 Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents: 17707
diff changeset
200 }
7982
a909a2869ac5 Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 5905
diff changeset
201 else if (v == Py_Ellipsis) {
a909a2869ac5 Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 5905
diff changeset
202 w_byte(TYPE_ELLIPSIS, p);
a909a2869ac5 Make new gcc -Wall happy
Guido van Rossum <guido@python.org>
parents: 5905
diff changeset
203 }
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
204 else if (v == Py_False) {
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22705
diff changeset
205 w_byte(TYPE_FALSE, p);
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22705
diff changeset
206 }
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22705
diff changeset
207 else if (v == Py_True) {
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22705
diff changeset
208 w_byte(TYPE_TRUE, p);
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22705
diff changeset
209 }
43815
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
210 else if (PyLong_CheckExact(v)) {
40626
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
211 long x = PyLong_AsLong(v);
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
212 if ((x == -1) && PyErr_Occurred()) {
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
213 PyLongObject *ob = (PyLongObject *)v;
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
214 PyErr_Clear();
52215
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
215 w_PyLong(ob, p);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
216 }
40626
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
217 else {
4656
186c2ad4abf3 Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4592
diff changeset
218 #if SIZEOF_LONG > 4
40626
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
219 long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
220 if (y && y != -1) {
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
221 w_byte(TYPE_INT64, p);
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
222 w_long64(x, p);
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
223 }
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
224 else
4656
186c2ad4abf3 Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4592
diff changeset
225 #endif
186c2ad4abf3 Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4592
diff changeset
226 {
40626
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
227 w_byte(TYPE_INT, p);
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
228 w_long(x, p);
4aee3f672f77 Merged the int/long unification branch, by very crude means (sorry Thomas!).
Guido van Rossum <guido@python.org>
parents: 40527
diff changeset
229 }
4592
3bf9e2beaf8c Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
230 }
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
231 }
43815
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
232 else if (PyFloat_CheckExact(v)) {
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
233 if (p->version > 1) {
35126
70681267a74a Fix signedness of various char variables to stop causing a warning under gcc 4.
Brett Cannon <bcannon@gmail.com>
parents: 35071
diff changeset
234 unsigned char buf[8];
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
235 if (_PyFloat_Pack8(PyFloat_AsDouble(v),
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
236 buf, 1) < 0) {
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
237 p->error = WFERR_UNMARSHALLABLE;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
238 return;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
239 }
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
240 w_byte(TYPE_BINARY_FLOAT, p);
35126
70681267a74a Fix signedness of various char variables to stop causing a warning under gcc 4.
Brett Cannon <bcannon@gmail.com>
parents: 35071
diff changeset
241 w_string((char*)buf, 8, p);
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
242 }
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
243 else {
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 52215
diff changeset
244 char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
53192
973f4d7aa87c Make sure that marshal and pickle continue to output 17
Mark Dickinson <dickinsm@gmail.com>
parents: 53187
diff changeset
245 'g', 17, 0, NULL);
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
246 if (!buf) {
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
247 p->error = WFERR_NOMEMORY;
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
248 return;
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
249 }
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 52215
diff changeset
250 n = strlen(buf);
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
251 w_byte(TYPE_FLOAT, p);
36522
2791676b3825 Move cast to suppress warning.
Martin v. Löwis <martin@v.loewis.de>
parents: 36501
diff changeset
252 w_byte((int)n, p);
36866
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
253 w_string(buf, (int)n, p);
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 52215
diff changeset
254 PyMem_Free(buf);
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
255 }
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
256 }
43815
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
257 else if (PyComplex_CheckExact(v)) {
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
258 if (p->version > 1) {
35126
70681267a74a Fix signedness of various char variables to stop causing a warning under gcc 4.
Brett Cannon <bcannon@gmail.com>
parents: 35071
diff changeset
259 unsigned char buf[8];
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
260 if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
261 buf, 1) < 0) {
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
262 p->error = WFERR_UNMARSHALLABLE;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
263 return;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
264 }
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
265 w_byte(TYPE_BINARY_COMPLEX, p);
35126
70681267a74a Fix signedness of various char variables to stop causing a warning under gcc 4.
Brett Cannon <bcannon@gmail.com>
parents: 35071
diff changeset
266 w_string((char*)buf, 8, p);
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
267 if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
268 buf, 1) < 0) {
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
269 p->error = WFERR_UNMARSHALLABLE;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
270 return;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
271 }
35126
70681267a74a Fix signedness of various char variables to stop causing a warning under gcc 4.
Brett Cannon <bcannon@gmail.com>
parents: 35071
diff changeset
272 w_string((char*)buf, 8, p);
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
273 }
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
274 else {
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 52215
diff changeset
275 char *buf;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
276 w_byte(TYPE_COMPLEX, p);
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 52215
diff changeset
277 buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
53192
973f4d7aa87c Make sure that marshal and pickle continue to output 17
Mark Dickinson <dickinsm@gmail.com>
parents: 53187
diff changeset
278 'g', 17, 0, NULL);
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
279 if (!buf) {
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
280 p->error = WFERR_NOMEMORY;
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
281 return;
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
282 }
36866
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
283 n = strlen(buf);
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
284 w_byte((int)n, p);
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
285 w_string(buf, (int)n, p);
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 52215
diff changeset
286 PyMem_Free(buf);
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 52215
diff changeset
287 buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
53192
973f4d7aa87c Make sure that marshal and pickle continue to output 17
Mark Dickinson <dickinsm@gmail.com>
parents: 53187
diff changeset
288 'g', 17, 0, NULL);
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
289 if (!buf) {
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
290 p->error = WFERR_NOMEMORY;
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
291 return;
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
292 }
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 52215
diff changeset
293 n = strlen(buf);
36866
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
294 w_byte((int)n, p);
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
295 w_string(buf, (int)n, p);
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 52215
diff changeset
296 PyMem_Free(buf);
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
297 }
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 3234
diff changeset
298 }
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
299 else if (PyBytes_CheckExact(v)) {
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
300 w_byte(TYPE_STRING, p);
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
301 n = PyBytes_GET_SIZE(v);
36866
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
302 if (n > INT_MAX) {
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
303 /* huge strings are not supported */
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
304 p->depth--;
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
305 p->error = WFERR_UNMARSHALLABLE;
36866
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
306 return;
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
307 }
2368
663aa059e29f hope to fix DEC Alpha gcc problems by declaring ints instead of longs
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
308 w_long((long)n, p);
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
309 w_string(PyBytes_AS_STRING(v), (int)n, p);
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
310 }
43815
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
311 else if (PyUnicode_CheckExact(v)) {
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
312 PyObject *utf8;
53681
52a77ef069cd Issue #3672: Reject surrogates in utf-8 codec; add surrogates error
Martin v. Löwis <martin@v.loewis.de>
parents: 53300
diff changeset
313 utf8 = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(v),
52a77ef069cd Issue #3672: Reject surrogates in utf-8 codec; add surrogates error
Martin v. Löwis <martin@v.loewis.de>
parents: 53300
diff changeset
314 PyUnicode_GET_SIZE(v),
53965
fbcdae3e0ca1 Rename the surrogates error handler to surrogatepass.
Martin v. Löwis <martin@v.loewis.de>
parents: 53707
diff changeset
315 "surrogatepass");
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
316 if (utf8 == NULL) {
13106
a6725acdf33b Urmpf. Quality control on this patch lapsed a bit. :-(
Guido van Rossum <guido@python.org>
parents: 13070
diff changeset
317 p->depth--;
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
318 p->error = WFERR_UNMARSHALLABLE;
13106
a6725acdf33b Urmpf. Quality control on this patch lapsed a bit. :-(
Guido van Rossum <guido@python.org>
parents: 13070
diff changeset
319 return;
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
320 }
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
321 w_byte(TYPE_UNICODE, p);
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
322 n = PyBytes_GET_SIZE(utf8);
36866
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
323 if (n > INT_MAX) {
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
324 p->depth--;
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
325 p->error = WFERR_UNMARSHALLABLE;
36866
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
326 return;
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
327 }
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
328 w_long((long)n, p);
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
329 w_string(PyBytes_AS_STRING(utf8), (int)n, p);
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
330 Py_DECREF(utf8);
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
331 }
43815
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
332 else if (PyTuple_CheckExact(v)) {
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
333 w_byte(TYPE_TUPLE, p);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
334 n = PyTuple_Size(v);
2368
663aa059e29f hope to fix DEC Alpha gcc problems by declaring ints instead of longs
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
335 w_long((long)n, p);
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
336 for (i = 0; i < n; i++) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
337 w_object(PyTuple_GET_ITEM(v, i), p);
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
338 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
339 }
43815
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
340 else if (PyList_CheckExact(v)) {
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
341 w_byte(TYPE_LIST, p);
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
342 n = PyList_GET_SIZE(v);
2368
663aa059e29f hope to fix DEC Alpha gcc problems by declaring ints instead of longs
Guido van Rossum <guido@python.org>
parents: 2062
diff changeset
343 w_long((long)n, p);
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
344 for (i = 0; i < n; i++) {
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
345 w_object(PyList_GET_ITEM(v, i), p);
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
346 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
347 }
43815
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
348 else if (PyDict_CheckExact(v)) {
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
349 Py_ssize_t pos;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
350 PyObject *key, *value;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
351 w_byte(TYPE_DICT, p);
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
352 /* This one is NULL object terminated! */
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
353 pos = 0;
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
354 while (PyDict_Next(v, &pos, &key, &value)) {
1288
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
355 w_object(key, p);
9fed5726a36d Several changes in one:
Guido van Rossum <guido@python.org>
parents: 1270
diff changeset
356 w_object(value, p);
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
357 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
358 w_object((PyObject *)NULL, p);
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
359 }
43815
85cf334b32c3 Merged revisions 58886-58929 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
360 else if (PyAnySet_CheckExact(v)) {
34394
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
361 PyObject *value, *it;
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
362
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
363 if (PyObject_TypeCheck(v, &PySet_Type))
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
364 w_byte(TYPE_SET, p);
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
365 else
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
366 w_byte(TYPE_FROZENSET, p);
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
367 n = PyObject_Size(v);
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
368 if (n == -1) {
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
369 p->depth--;
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
370 p->error = WFERR_UNMARSHALLABLE;
34394
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
371 return;
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
372 }
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
373 w_long((long)n, p);
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
374 it = PyObject_GetIter(v);
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
375 if (it == NULL) {
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
376 p->depth--;
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
377 p->error = WFERR_UNMARSHALLABLE;
34394
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
378 return;
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
379 }
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
380 while ((value = PyIter_Next(it)) != NULL) {
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
381 w_object(value, p);
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
382 Py_DECREF(value);
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
383 }
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
384 Py_DECREF(it);
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
385 if (PyErr_Occurred()) {
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
386 p->depth--;
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
387 p->error = WFERR_UNMARSHALLABLE;
34394
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
388 return;
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
389 }
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
390 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
391 else if (PyCode_Check(v)) {
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
392 PyCodeObject *co = (PyCodeObject *)v;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
393 w_byte(TYPE_CODE, p);
23851
d6ae544acd24 Fix SF bug # 561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 22785
diff changeset
394 w_long(co->co_argcount, p);
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
395 w_long(co->co_kwonlyargcount, p);
23851
d6ae544acd24 Fix SF bug # 561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 22785
diff changeset
396 w_long(co->co_nlocals, p);
d6ae544acd24 Fix SF bug # 561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 22785
diff changeset
397 w_long(co->co_stacksize, p);
d6ae544acd24 Fix SF bug # 561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 22785
diff changeset
398 w_long(co->co_flags, p);
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 8465
diff changeset
399 w_object(co->co_code, p);
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
400 w_object(co->co_consts, p);
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
401 w_object(co->co_names, p);
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2503
diff changeset
402 w_object(co->co_varnames, p);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15979
diff changeset
403 w_object(co->co_freevars, p);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15979
diff changeset
404 w_object(co->co_cellvars, p);
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
405 w_object(co->co_filename, p);
1257
1cabc2b6c970 * Changed all copyright messages to include 1993.
Guido van Rossum <guido@python.org>
parents: 1191
diff changeset
406 w_object(co->co_name, p);
23851
d6ae544acd24 Fix SF bug # 561858 Assertion with very long lists
Neal Norwitz <nnorwitz@gmail.com>
parents: 22785
diff changeset
407 w_long(co->co_firstlineno, p);
5042
9b7e0cf51990 Marshal the line number table of code objects.
Guido van Rossum <guido@python.org>
parents: 4995
diff changeset
408 w_object(co->co_lnotab, p);
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
409 }
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42404
diff changeset
410 else if (PyObject_CheckBuffer(v)) {
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 8465
diff changeset
411 /* Write unknown buffer-style objects as a string */
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 8465
diff changeset
412 char *s;
20947
c555f1e7c4be Use PyObject_CheckReadBuffer().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 20552
diff changeset
413 PyBufferProcs *pb = v->ob_type->tp_as_buffer;
43423
0476a2cc5658 Change PyBuffer to Py_buffer to be consistent with other non-object structures like Py_complex. Add some more functionality to the memoryview object.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43007
diff changeset
414 Py_buffer view;
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42404
diff changeset
415 if ((*pb->bf_getbuffer)(v, &view, PyBUF_SIMPLE) != 0) {
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42404
diff changeset
416 w_byte(TYPE_UNKNOWN, p);
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
417 p->error = WFERR_UNMARSHALLABLE;
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42404
diff changeset
418 }
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 8465
diff changeset
419 w_byte(TYPE_STRING, p);
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42404
diff changeset
420 n = view.len;
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42404
diff changeset
421 s = view.buf;
36866
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
422 if (n > INT_MAX) {
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
423 p->depth--;
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
424 p->error = WFERR_UNMARSHALLABLE;
36866
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
425 return;
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
426 }
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 8465
diff changeset
427 w_long((long)n, p);
36866
9eb24f92a784 Change int to Py_ssize_t in several places.
Martin v. Löwis <martin@v.loewis.de>
parents: 36792
diff changeset
428 w_string(s, (int)n, p);
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42404
diff changeset
429 if (pb->bf_releasebuffer != NULL)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42404
diff changeset
430 (*pb->bf_releasebuffer)(v, &view);
9293
0a67db47e1d0 Changes to support other object types besides strings
Guido van Rossum <guido@python.org>
parents: 8465
diff changeset
431 }
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
432 else {
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
433 w_byte(TYPE_UNKNOWN, p);
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
434 p->error = WFERR_UNMARSHALLABLE;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
435 }
13106
a6725acdf33b Urmpf. Quality control on this patch lapsed a bit. :-(
Guido van Rossum <guido@python.org>
parents: 13070
diff changeset
436 p->depth--;
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
437 }
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
438
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
439 /* version currently has no effect for writing longs. */
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
440 void
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
441 PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
442 {
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
443 WFILE wf;
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
444 wf.fp = fp;
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
445 wf.error = WFERR_OK;
13070
7392e71f6cce Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
446 wf.depth = 0;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
447 wf.strings = NULL;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
448 wf.version = version;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
449 w_long(x, &wf);
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
450 }
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
451
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
452 void
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
453 PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
454 {
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
455 WFILE wf;
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
456 wf.fp = fp;
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
457 wf.error = WFERR_OK;
13106
a6725acdf33b Urmpf. Quality control on this patch lapsed a bit. :-(
Guido van Rossum <guido@python.org>
parents: 13070
diff changeset
458 wf.depth = 0;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
459 wf.strings = (version > 0) ? PyDict_New() : NULL;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
460 wf.version = version;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
461 w_object(x, &wf);
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
462 Py_XDECREF(wf.strings);
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
463 }
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
464
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
465 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
466
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
467 #define rs_byte(p) (((p)->ptr < (p)->end) ? (unsigned char)*(p)->ptr++ : EOF)
2503
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
468
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
469 #define r_byte(p) ((p)->fp ? getc((p)->fp) : rs_byte(p))
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
470
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
471 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
472 r_string(char *s, int n, RFILE *p)
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
473 {
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
474 if (p->fp != NULL)
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
475 /* The result fits into int because it must be <=n. */
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
476 return (int)fread(s, 1, n, p->fp);
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
477 if (p->end - p->ptr < n)
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
478 n = (int)(p->end - p->ptr);
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
479 memcpy(s, p->ptr, n);
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
480 p->ptr += n;
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
481 return n;
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
482 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
483
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
484 static int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
485 r_short(RFILE *p)
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
486 {
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
487 register short x;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
488 x = r_byte(p);
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
489 x |= r_byte(p) << 8;
14678
94ca87a3e5ee Obscure marshal fixes:
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
490 /* Sign-extension, in case short greater than 16 bits */
94ca87a3e5ee Obscure marshal fixes:
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
491 x |= -(x & 0x8000);
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
492 return x;
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
493 }
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
494
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
495 static long
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
496 r_long(RFILE *p)
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
497 {
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
498 register long x;
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
499 register FILE *fp = p->fp;
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
500 if (fp) {
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
501 x = getc(fp);
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
502 x |= (long)getc(fp) << 8;
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
503 x |= (long)getc(fp) << 16;
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
504 x |= (long)getc(fp) << 24;
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
505 }
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
506 else {
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
507 x = rs_byte(p);
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
508 x |= (long)rs_byte(p) << 8;
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
509 x |= (long)rs_byte(p) << 16;
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
510 x |= (long)rs_byte(p) << 24;
4dd1af0ddef0 various tuple related optimizations; remove unused b/w compat code from ceval.c
Guido van Rossum <guido@python.org>
parents: 2368
diff changeset
511 }
4656
186c2ad4abf3 Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4592
diff changeset
512 #if SIZEOF_LONG > 4
4592
3bf9e2beaf8c Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
513 /* Sign extension for 64-bit machines */
14678
94ca87a3e5ee Obscure marshal fixes:
Tim Peters <tim.peters@gmail.com>
parents: 14375
diff changeset
514 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
515 #endif
4592
3bf9e2beaf8c Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
516 return x;
3bf9e2beaf8c Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
517 }
3bf9e2beaf8c Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
518
19547
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
519 /* r_long64 deals with the TYPE_INT64 code. On a machine with
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
520 sizeof(long) > 4, it returns a Python int object, else a Python long
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
521 object. Note that w_long64 writes out TYPE_INT if 32 bits is enough,
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
522 so there's no inefficiency here in returning a PyLong on 32-bit boxes
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
523 for everything written via TYPE_INT64 (i.e., if an int is written via
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
524 TYPE_INT64, it *needs* more than 32 bits).
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
525 */
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
526 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
527 r_long64(RFILE *p)
4592
3bf9e2beaf8c Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
528 {
19547
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
529 long lo4 = r_long(p);
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
530 long hi4 = r_long(p);
4656
186c2ad4abf3 Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4592
diff changeset
531 #if SIZEOF_LONG > 4
19547
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
532 long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43815
diff changeset
533 return PyLong_FromLong(x);
4656
186c2ad4abf3 Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4592
diff changeset
534 #else
19547
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
535 unsigned char buf[8];
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
536 int one = 1;
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
537 int is_little_endian = (int)*(char*)&one;
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
538 if (is_little_endian) {
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
539 memcpy(buf, &lo4, 4);
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
540 memcpy(buf+4, &hi4, 4);
4592
3bf9e2beaf8c Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
541 }
19547
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
542 else {
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
543 memcpy(buf, &hi4, 4);
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
544 memcpy(buf+4, &lo4, 4);
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
545 }
7e628f60245e marshal.c r_long64: When reading a TYPE_INT64 value on a box with 32-bit
Tim Peters <tim.peters@gmail.com>
parents: 19343
diff changeset
546 return _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
4656
186c2ad4abf3 Better way to handle 64-bit ints, keeping gcc -Wall happy.
Guido van Rossum <guido@python.org>
parents: 4592
diff changeset
547 #endif
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
548 }
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
549
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
550 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
551 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
552 {
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
553 PyLongObject *ob;
56297
08e59076d86b Merged revisions 75145 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 54035
diff changeset
554 int size, i, j, md, shorts_in_top_digit;
52215
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
555 long n;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
556 digit d;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
557
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
558 n = r_long(p);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
559 if (n == 0)
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
560 return (PyObject *)_PyLong_New(0);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
561 if (n < -INT_MAX || n > INT_MAX) {
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
562 PyErr_SetString(PyExc_ValueError,
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
563 "bad marshal data (long size out of range)");
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
564 return NULL;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
565 }
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
566
56297
08e59076d86b Merged revisions 75145 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 54035
diff changeset
567 size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
08e59076d86b Merged revisions 75145 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 54035
diff changeset
568 shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
52215
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
569 ob = _PyLong_New(size);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
570 if (ob == NULL)
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
571 return NULL;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
572 Py_SIZE(ob) = n > 0 ? size : -size;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
573
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
574 for (i = 0; i < size-1; i++) {
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
575 d = 0;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
576 for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
577 md = r_short(p);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
578 if (md < 0 || md > PyLong_MARSHAL_BASE)
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
579 goto bad_digit;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
580 d += (digit)md << j*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
581 }
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
582 ob->ob_digit[i] = d;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
583 }
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
584 d = 0;
56297
08e59076d86b Merged revisions 75145 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 54035
diff changeset
585 for (j=0; j < shorts_in_top_digit; j++) {
52215
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
586 md = r_short(p);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
587 if (md < 0 || md > PyLong_MARSHAL_BASE)
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
588 goto bad_digit;
56297
08e59076d86b Merged revisions 75145 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 54035
diff changeset
589 /* topmost marshal digit should be nonzero */
08e59076d86b Merged revisions 75145 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 54035
diff changeset
590 if (md == 0 && j == shorts_in_top_digit - 1) {
08e59076d86b Merged revisions 75145 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 54035
diff changeset
591 Py_DECREF(ob);
08e59076d86b Merged revisions 75145 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 54035
diff changeset
592 PyErr_SetString(PyExc_ValueError,
08e59076d86b Merged revisions 75145 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 54035
diff changeset
593 "bad marshal data (unnormalized long data)");
08e59076d86b Merged revisions 75145 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 54035
diff changeset
594 return NULL;
08e59076d86b Merged revisions 75145 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 54035
diff changeset
595 }
52215
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
596 d += (digit)md << j*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
597 }
56297
08e59076d86b Merged revisions 75145 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 54035
diff changeset
598 /* top digit should be nonzero, else the resulting PyLong won't be
08e59076d86b Merged revisions 75145 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 54035
diff changeset
599 normalized */
52215
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
600 ob->ob_digit[size-1] = d;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
601 return (PyObject *)ob;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
602 bad_digit:
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
603 Py_DECREF(ob);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
604 PyErr_SetString(PyExc_ValueError,
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
605 "bad marshal data (digit out of range in long)");
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
606 return NULL;
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
607 }
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
608
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
609
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
610 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
611 r_object(RFILE *p)
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
612 {
31824
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
613 /* NULL is a valid return value, it does not necessarily means that
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
614 an exception is set. */
45071
f380d991390e Merged revisions 60441-60474 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45044
diff changeset
615 PyObject *v, *v2;
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
616 long i, n;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
617 int type = r_byte(p);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
618 PyObject *retval;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
619
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
620 p->depth++;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
621
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
622 if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
623 p->depth--;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
624 PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
625 return NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
626 }
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
627
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
628 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
629
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
630 case EOF:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
631 PyErr_SetString(PyExc_EOFError,
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
632 "EOF read where object expected");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
633 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
634 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
635
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
636 case TYPE_NULL:
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
637 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
638 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
639
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
640 case TYPE_NONE:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
641 Py_INCREF(Py_None);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
642 retval = Py_None;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
643 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
644
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
645 case TYPE_STOPITER:
7bc473b2c654 Merging the gen-branch into the main line, at Guido's direction. Yay!
Tim Peters <tim.peters@gmail.com>
parents: 17707
diff changeset
646 Py_INCREF(PyExc_StopIteration);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
647 retval = PyExc_StopIteration;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
648 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
649
4403
3b3f7c3f6da2 Ellipses -> Ellipsis rename (the dictionary really says that it should
Guido van Rossum <guido@python.org>
parents: 4039
diff changeset
650 case TYPE_ELLIPSIS:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
651 Py_INCREF(Py_Ellipsis);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
652 retval = Py_Ellipsis;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
653 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
654
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
655 case TYPE_FALSE:
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22705
diff changeset
656 Py_INCREF(Py_False);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
657 retval = Py_False;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
658 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
659
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22705
diff changeset
660 case TYPE_TRUE:
aa8d59823add Add the 'bool' type and its values 'False' and 'True', as described in
Guido van Rossum <guido@python.org>
parents: 22705
diff changeset
661 Py_INCREF(Py_True);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
662 retval = Py_True;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
663 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
664
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
665 case TYPE_INT:
44099
f324631462a2 Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents: 43815
diff changeset
666 retval = PyLong_FromLong(r_long(p));
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
667 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
668
4592
3bf9e2beaf8c Tentative changes to make this work better on 64-bit machines.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
669 case TYPE_INT64:
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
670 retval = r_long64(p);
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
671 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
672
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
673 case TYPE_LONG:
52215
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
674 retval = r_PyLong(p);
bb5de24a343f Issue #4258: Make it possible to use 30-bit digits for PyLongs:
Mark Dickinson <dickinsm@gmail.com>
parents: 52171
diff changeset
675 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
676
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
677 case TYPE_FLOAT:
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
678 {
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
679 char buf[256];
5119
bda01a374762 Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents: 5115
diff changeset
680 double dx;
53707
13a82a710f19 Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents: 53681
diff changeset
681 retval = NULL;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
682 n = r_byte(p);
31824
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
683 if (n == EOF || r_string(buf, (int)n, p) != n) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
684 PyErr_SetString(PyExc_EOFError,
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
685 "EOF read where object expected");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
686 break;
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
687 }
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
688 buf[n] = '\0';
53707
13a82a710f19 Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents: 53681
diff changeset
689 dx = PyOS_string_to_double(buf, NULL, NULL);
13a82a710f19 Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents: 53681
diff changeset
690 if (dx == -1.0 && PyErr_Occurred())
13a82a710f19 Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents: 53681
diff changeset
691 break;
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
692 retval = PyFloat_FromDouble(dx);
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
693 break;
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
694 }
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
695
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
696 case TYPE_BINARY_FLOAT:
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
697 {
35126
70681267a74a Fix signedness of various char variables to stop causing a warning under gcc 4.
Brett Cannon <bcannon@gmail.com>
parents: 35071
diff changeset
698 unsigned char buf[8];
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
699 double x;
35126
70681267a74a Fix signedness of various char variables to stop causing a warning under gcc 4.
Brett Cannon <bcannon@gmail.com>
parents: 35071
diff changeset
700 if (r_string((char*)buf, 8, p) != 8) {
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
701 PyErr_SetString(PyExc_EOFError,
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
702 "EOF read where object expected");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
703 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
704 break;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
705 }
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
706 x = _PyFloat_Unpack8(buf, 1);
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
707 if (x == -1.0 && PyErr_Occurred()) {
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
708 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
709 break;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
710 }
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
711 retval = PyFloat_FromDouble(x);
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
712 break;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
713 }
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
714
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 3234
diff changeset
715 case TYPE_COMPLEX:
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 3234
diff changeset
716 {
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 3234
diff changeset
717 char buf[256];
3766
516490c8192c Py_complex; and WITHOUT_COMPLEX added to getargs.c
Guido van Rossum <guido@python.org>
parents: 3731
diff changeset
718 Py_complex c;
53707
13a82a710f19 Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents: 53681
diff changeset
719 retval = NULL;
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 3234
diff changeset
720 n = r_byte(p);
31824
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
721 if (n == EOF || r_string(buf, (int)n, p) != n) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
722 PyErr_SetString(PyExc_EOFError,
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 3234
diff changeset
723 "EOF read where object expected");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
724 break;
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 3234
diff changeset
725 }
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 3234
diff changeset
726 buf[n] = '\0';
53707
13a82a710f19 Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents: 53681
diff changeset
727 c.real = PyOS_string_to_double(buf, NULL, NULL);
13a82a710f19 Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents: 53681
diff changeset
728 if (c.real == -1.0 && PyErr_Occurred())
13a82a710f19 Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents: 53681
diff changeset
729 break;
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 3234
diff changeset
730 n = r_byte(p);
31824
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
731 if (n == EOF || r_string(buf, (int)n, p) != n) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
732 PyErr_SetString(PyExc_EOFError,
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 3234
diff changeset
733 "EOF read where object expected");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
734 break;
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 3234
diff changeset
735 }
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 3234
diff changeset
736 buf[n] = '\0';
53707
13a82a710f19 Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents: 53681
diff changeset
737 c.imag = PyOS_string_to_double(buf, NULL, NULL);
13a82a710f19 Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents: 53681
diff changeset
738 if (c.imag == -1.0 && PyErr_Occurred())
13a82a710f19 Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents: 53681
diff changeset
739 break;
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
740 retval = PyComplex_FromCComplex(c);
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
741 break;
3323
6098aaa8ae7f changes for complex numbers
Guido van Rossum <guido@python.org>
parents: 3234
diff changeset
742 }
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
743
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
744 case TYPE_BINARY_COMPLEX:
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
745 {
35126
70681267a74a Fix signedness of various char variables to stop causing a warning under gcc 4.
Brett Cannon <bcannon@gmail.com>
parents: 35071
diff changeset
746 unsigned char buf[8];
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
747 Py_complex c;
35126
70681267a74a Fix signedness of various char variables to stop causing a warning under gcc 4.
Brett Cannon <bcannon@gmail.com>
parents: 35071
diff changeset
748 if (r_string((char*)buf, 8, p) != 8) {
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
749 PyErr_SetString(PyExc_EOFError,
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
750 "EOF read where object expected");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
751 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
752 break;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
753 }
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
754 c.real = _PyFloat_Unpack8(buf, 1);
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
755 if (c.real == -1.0 && PyErr_Occurred()) {
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
756 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
757 break;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
758 }
35126
70681267a74a Fix signedness of various char variables to stop causing a warning under gcc 4.
Brett Cannon <bcannon@gmail.com>
parents: 35071
diff changeset
759 if (r_string((char*)buf, 8, p) != 8) {
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
760 PyErr_SetString(PyExc_EOFError,
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
761 "EOF read where object expected");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
762 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
763 break;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
764 }
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
765 c.imag = _PyFloat_Unpack8(buf, 1);
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
766 if (c.imag == -1.0 && PyErr_Occurred()) {
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
767 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
768 break;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
769 }
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
770 retval = PyComplex_FromCComplex(c);
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
771 break;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
772 }
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
773
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
774 case TYPE_STRING:
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
775 n = r_long(p);
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
776 if (n < 0 || n > INT_MAX) {
52171
4e927faf30ea Merged revisions 70378 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 49057
diff changeset
777 PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
778 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
779 break;
8465
0e6fbbe3b63c When unmarshalling, add test for negative lengths on strings, tuples
Guido van Rossum <guido@python.org>
parents: 8329
diff changeset
780 }
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
781 v = PyBytes_FromStringAndSize((char *)NULL, n);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
782 if (v == NULL) {
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
783 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
784 break;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
785 }
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
786 if (r_string(PyBytes_AS_STRING(v), (int)n, p) != n) {
35010
8e9682fd57f8 Fix a couple of crashing-on-malformed data marshal bugs.
Michael W. Hudson <mwh@python.net>
parents: 35008
diff changeset
787 Py_DECREF(v);
8e9682fd57f8 Fix a couple of crashing-on-malformed data marshal bugs.
Michael W. Hudson <mwh@python.net>
parents: 35008
diff changeset
788 PyErr_SetString(PyExc_EOFError,
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
789 "EOF read where object expected");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
790 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
791 break;
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
792 }
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
793 retval = v;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
794 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
795
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
796 case TYPE_UNICODE:
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
797 {
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
798 char *buffer;
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
799
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
800 n = r_long(p);
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
801 if (n < 0 || n > INT_MAX) {
52171
4e927faf30ea Merged revisions 70378 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 49057
diff changeset
802 PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
803 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
804 break;
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
805 }
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12135
diff changeset
806 buffer = PyMem_NEW(char, n);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
807 if (buffer == NULL) {
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
808 retval = PyErr_NoMemory();
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
809 break;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
810 }
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
811 if (r_string(buffer, (int)n, p) != n) {
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12135
diff changeset
812 PyMem_DEL(buffer);
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
813 PyErr_SetString(PyExc_EOFError,
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
814 "EOF read where object expected");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
815 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
816 break;
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
817 }
53965
fbcdae3e0ca1 Rename the surrogates error handler to surrogatepass.
Martin v. Löwis <martin@v.loewis.de>
parents: 53707
diff changeset
818 v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 12135
diff changeset
819 PyMem_DEL(buffer);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
820 retval = v;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
821 break;
11976
513354d87a85 Marc-Andre Lemburg: support marshalling Unicode objects (code 'u').
Guido van Rossum <guido@python.org>
parents: 9300
diff changeset
822 }
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
823
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
824 case TYPE_TUPLE:
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
825 n = r_long(p);
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
826 if (n < 0 || n > INT_MAX) {
52171
4e927faf30ea Merged revisions 70378 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 49057
diff changeset
827 PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
828 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
829 break;
8465
0e6fbbe3b63c When unmarshalling, add test for negative lengths on strings, tuples
Guido van Rossum <guido@python.org>
parents: 8329
diff changeset
830 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
831 v = PyTuple_New((int)n);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
832 if (v == NULL) {
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
833 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
834 break;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
835 }
3234
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
836 for (i = 0; i < n; i++) {
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
837 v2 = r_object(p);
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
838 if ( v2 == NULL ) {
31824
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
839 if (!PyErr_Occurred())
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
840 PyErr_SetString(PyExc_TypeError,
52171
4e927faf30ea Merged revisions 70378 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 49057
diff changeset
841 "NULL object in marshal data for tuple");
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
842 Py_DECREF(v);
3234
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
843 v = NULL;
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
844 break;
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
845 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
846 PyTuple_SET_ITEM(v, (int)i, v2);
3234
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
847 }
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
848 retval = v;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
849 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
850
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
851 case TYPE_LIST:
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
852 n = r_long(p);
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
853 if (n < 0 || n > INT_MAX) {
52171
4e927faf30ea Merged revisions 70378 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 49057
diff changeset
854 PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
855 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
856 break;
8465
0e6fbbe3b63c When unmarshalling, add test for negative lengths on strings, tuples
Guido van Rossum <guido@python.org>
parents: 8329
diff changeset
857 }
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
858 v = PyList_New((int)n);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
859 if (v == NULL) {
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
860 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
861 break;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
862 }
3234
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
863 for (i = 0; i < n; i++) {
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
864 v2 = r_object(p);
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
865 if ( v2 == NULL ) {
31824
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
866 if (!PyErr_Occurred())
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
867 PyErr_SetString(PyExc_TypeError,
52171
4e927faf30ea Merged revisions 70378 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 49057
diff changeset
868 "NULL object in marshal data for list");
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
869 Py_DECREF(v);
3234
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
870 v = NULL;
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
871 break;
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
872 }
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
873 PyList_SET_ITEM(v, (int)i, v2);
3234
aafe7d634985 Made a bit more robust against out-of-memory situations
Jack Jansen <jack.jansen@cwi.nl>
parents: 3012
diff changeset
874 }
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
875 retval = v;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
876 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
877
279
9c924f9c3b16 Add marshalling for dictionaries.
Guido van Rossum <guido@python.org>
parents: 272
diff changeset
878 case TYPE_DICT:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
879 v = PyDict_New();
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
880 if (v == NULL) {
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
881 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
882 break;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
883 }
279
9c924f9c3b16 Add marshalling for dictionaries.
Guido van Rossum <guido@python.org>
parents: 272
diff changeset
884 for (;;) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
885 PyObject *key, *val;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
886 key = r_object(p);
279
9c924f9c3b16 Add marshalling for dictionaries.
Guido van Rossum <guido@python.org>
parents: 272
diff changeset
887 if (key == NULL)
31824
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
888 break;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
889 val = r_object(p);
3731
de1cb33219e3 Jeremy's patches for more robust handling of unmarshallable types.
Guido van Rossum <guido@python.org>
parents: 3620
diff changeset
890 if (val != NULL)
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
891 PyDict_SetItem(v, key, val);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
892 Py_DECREF(key);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
893 Py_XDECREF(val);
279
9c924f9c3b16 Add marshalling for dictionaries.
Guido van Rossum <guido@python.org>
parents: 272
diff changeset
894 }
31824
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
895 if (PyErr_Occurred()) {
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
896 Py_DECREF(v);
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
897 v = NULL;
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
898 }
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
899 retval = v;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
900 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
901
34394
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
902 case TYPE_SET:
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
903 case TYPE_FROZENSET:
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
904 n = r_long(p);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
905 if (n < 0 || n > INT_MAX) {
52171
4e927faf30ea Merged revisions 70378 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 49057
diff changeset
906 PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
907 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
908 break;
34394
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
909 }
45044
c3b38a85989f Merged revisions 60383-60407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
910 v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
911 if (v == NULL) {
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
912 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
913 break;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
914 }
34394
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
915 for (i = 0; i < n; i++) {
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
916 v2 = r_object(p);
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
917 if ( v2 == NULL ) {
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
918 if (!PyErr_Occurred())
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
919 PyErr_SetString(PyExc_TypeError,
52171
4e927faf30ea Merged revisions 70378 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 49057
diff changeset
920 "NULL object in marshal data for set");
34394
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
921 Py_DECREF(v);
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
922 v = NULL;
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
923 break;
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
924 }
45044
c3b38a85989f Merged revisions 60383-60407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
925 if (PySet_Add(v, v2) == -1) {
c3b38a85989f Merged revisions 60383-60407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
926 Py_DECREF(v);
c3b38a85989f Merged revisions 60383-60407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
927 Py_DECREF(v2);
c3b38a85989f Merged revisions 60383-60407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
928 v = NULL;
c3b38a85989f Merged revisions 60383-60407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
929 break;
c3b38a85989f Merged revisions 60383-60407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
930 }
45082
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45071
diff changeset
931 Py_DECREF(v2);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
932 }
45044
c3b38a85989f Merged revisions 60383-60407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
933 retval = v;
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
934 break;
34394
b480abaf1f6f SF 1098985: set objects cannot be marshalled
Raymond Hettinger <python@rcn.com>
parents: 34205
diff changeset
935
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
936 case TYPE_CODE:
41715
f60c877d52c8 Merged revisions 55270-55324 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41653
diff changeset
937 {
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
938 int argcount;
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
939 int kwonlyargcount;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
940 int nlocals;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
941 int stacksize;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
942 int flags;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
943 PyObject *code = NULL;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
944 PyObject *consts = NULL;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
945 PyObject *names = NULL;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
946 PyObject *varnames = NULL;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
947 PyObject *freevars = NULL;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
948 PyObject *cellvars = NULL;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
949 PyObject *filename = NULL;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
950 PyObject *name = NULL;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
951 int firstlineno;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
952 PyObject *lnotab = NULL;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
953
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
954 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
955
41715
f60c877d52c8 Merged revisions 55270-55324 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41653
diff changeset
956 /* XXX ignore long->int overflows for now */
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
957 argcount = (int)r_long(p);
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
958 kwonlyargcount = (int)r_long(p);
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
959 nlocals = (int)r_long(p);
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
960 stacksize = (int)r_long(p);
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
961 flags = (int)r_long(p);
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
962 code = r_object(p);
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
963 if (code == NULL)
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
964 goto code_error;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
965 consts = r_object(p);
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
966 if (consts == NULL)
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
967 goto code_error;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
968 names = r_object(p);
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
969 if (names == NULL)
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
970 goto code_error;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
971 varnames = r_object(p);
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
972 if (varnames == NULL)
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
973 goto code_error;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
974 freevars = r_object(p);
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
975 if (freevars == NULL)
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
976 goto code_error;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
977 cellvars = r_object(p);
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
978 if (cellvars == NULL)
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
979 goto code_error;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
980 filename = r_object(p);
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
981 if (filename == NULL)
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
982 goto code_error;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
983 name = r_object(p);
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
984 if (name == NULL)
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
985 goto code_error;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
986 firstlineno = (int)r_long(p);
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
987 lnotab = r_object(p);
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
988 if (lnotab == NULL)
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
989 goto code_error;
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
990
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
991 v = (PyObject *) PyCode_New(
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
992 argcount, kwonlyargcount,
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
993 nlocals, stacksize, flags,
2844
0261bf5b3819 keyword arguments and faster calls
Guido van Rossum <guido@python.org>
parents: 2503
diff changeset
994 code, consts, names, varnames,
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
995 freevars, cellvars, filename, name,
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
996 firstlineno, lnotab);
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
997
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
998 code_error:
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
999 Py_XDECREF(code);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1000 Py_XDECREF(consts);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1001 Py_XDECREF(names);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1002 Py_XDECREF(varnames);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15979
diff changeset
1003 Py_XDECREF(freevars);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15979
diff changeset
1004 Py_XDECREF(cellvars);
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1005 Py_XDECREF(filename);
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1006 Py_XDECREF(name);
5905
c2423843a26f Plugged a leak. (The same as the one plugged in compile.c -- forgot
Guido van Rossum <guido@python.org>
parents: 5608
diff changeset
1007 Py_XDECREF(lnotab);
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1008 }
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
1009 retval = v;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
1010 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
1011
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1012 default:
3731
de1cb33219e3 Jeremy's patches for more robust handling of unmarshallable types.
Guido van Rossum <guido@python.org>
parents: 3620
diff changeset
1013 /* Bogus data got written, which isn't ideal.
de1cb33219e3 Jeremy's patches for more robust handling of unmarshallable types.
Guido van Rossum <guido@python.org>
parents: 3620
diff changeset
1014 This will let you keep working and recover. */
52171
4e927faf30ea Merged revisions 70378 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 49057
diff changeset
1015 PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
1016 retval = NULL;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
1017 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
1018
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1019 }
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
1020 p->depth--;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
1021 return retval;
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1022 }
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1023
32343
54b257e55f99 Make private function static
Neal Norwitz <nnorwitz@gmail.com>
parents: 32305
diff changeset
1024 static PyObject *
31824
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
1025 read_object(RFILE *p)
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
1026 {
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
1027 PyObject *v;
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
1028 if (PyErr_Occurred()) {
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
1029 fprintf(stderr, "XXX readobject called with exception set\n");
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
1030 return NULL;
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
1031 }
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
1032 v = r_object(p);
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
1033 if (v == NULL && !PyErr_Occurred())
52171
4e927faf30ea Merged revisions 70378 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 49057
diff changeset
1034 PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
31824
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
1035 return v;
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
1036 }
331de8b9d1ed Marshal clean-up (SF patch #873224)
Armin Rigo <arigo@tunes.org>
parents: 30311
diff changeset
1037
20552
65dd6157f999 SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents: 19605
diff changeset
1038 int
65dd6157f999 SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents: 19605
diff changeset
1039 PyMarshal_ReadShortFromFile(FILE *fp)
65dd6157f999 SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents: 19605
diff changeset
1040 {
65dd6157f999 SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents: 19605
diff changeset
1041 RFILE rf;
36783
965bb4a54096 Fix gcc (4.0.x) warning about use of uninitialized variables.
Thomas Wouters <thomas@python.org>
parents: 36522
diff changeset
1042 assert(fp);
20552
65dd6157f999 SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents: 19605
diff changeset
1043 rf.fp = fp;
36784
d853bc06847e Fix incompatible assignment warning from previous checkin.
Thomas Wouters <thomas@python.org>
parents: 36783
diff changeset
1044 rf.strings = NULL;
d853bc06847e Fix incompatible assignment warning from previous checkin.
Thomas Wouters <thomas@python.org>
parents: 36783
diff changeset
1045 rf.end = rf.ptr = NULL;
20552
65dd6157f999 SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents: 19605
diff changeset
1046 return r_short(&rf);
65dd6157f999 SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents: 19605
diff changeset
1047 }
65dd6157f999 SF patch #470393 (Jim Ahlstrom): Add missing marshal function
Guido van Rossum <guido@python.org>
parents: 19605
diff changeset
1048
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1049 long
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
1050 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
1051 {
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1052 RFILE rf;
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1053 rf.fp = fp;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1054 rf.strings = NULL;
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
1055 rf.ptr = rf.end = NULL;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1056 return r_long(&rf);
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1057 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1058
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
1059 #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
1060 /* 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
1061 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
1062 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
1063 {
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
1064 struct stat st;
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
1065 if (fstat(fileno(fp), &st) != 0)
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
1066 return -1;
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
1067 else
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
1068 return st.st_size;
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
1069 }
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
1070 #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
1071
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
1072 /* 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
1073 * 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
1074 * 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
1075 * 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
1076 * 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
1077 */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1078 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
1079 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
1080 {
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
1081 /* 75% of 2.1's .pyc files can exploit SMALL_FILE_LIMIT.
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
1082 * REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc.
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
1083 */
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
1084 #define SMALL_FILE_LIMIT (1L << 14)
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
1085 #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
1086 #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
1087 off_t filesize;
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
1088 #endif
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
1089 #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
1090 filesize = getfilesize(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
1091 if (filesize > 0) {
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
1092 char buf[SMALL_FILE_LIMIT];
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
1093 char* pBuf = NULL;
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
1094 if (filesize <= SMALL_FILE_LIMIT)
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
1095 pBuf = buf;
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
1096 else if (filesize <= REASONABLE_FILE_LIMIT)
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
1097 pBuf = (char *)PyMem_MALLOC(filesize);
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
1098 if (pBuf != NULL) {
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
1099 PyObject* v;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
1100 size_t n;
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
1101 /* filesize must fit into an int, because it
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
1102 is smaller than REASONABLE_FILE_LIMIT */
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
1103 n = fread(pBuf, 1, (int)filesize, fp);
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
1104 v = PyMarshal_ReadObjectFromString(pBuf, n);
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
1105 if (pBuf != buf)
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
1106 PyMem_FREE(pBuf);
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
1107 return v;
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
1108 }
16311
8c41f3861aad It's unclear whether PyMarshal_XXX() are part of the public or private API.
Tim Peters <tim.peters@gmail.com>
parents: 16257
diff changeset
1109
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
1110 }
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
1111 #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
1112 /* We don't have fstat, or we do but the file is larger than
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
1113 * REASONABLE_FILE_LIMIT or malloc failed -- read a byte at a time.
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
1114 */
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
1115 return PyMarshal_ReadObjectFromFile(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
1116
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
1117 #undef SMALL_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
1118 #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
1119 }
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
1120
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
1121 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
1122 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
1123 {
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
1124 RFILE rf;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1125 PyObject *result;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1126 rf.fp = fp;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1127 rf.strings = PyList_New(0);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
1128 rf.depth = 0;
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
1129 rf.ptr = rf.end = NULL;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1130 result = r_object(&rf);
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1131 Py_DECREF(rf.strings);
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1132 return result;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1133 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1134
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1135 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36324
diff changeset
1136 PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len)
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
1137 {
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
1138 RFILE rf;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1139 PyObject *result;
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
1140 rf.fp = NULL;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
1141 rf.ptr = str;
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
1142 rf.end = str + len;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1143 rf.strings = PyList_New(0);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
1144 rf.depth = 0;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1145 result = r_object(&rf);
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1146 Py_DECREF(rf.strings);
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1147 return result;
1270
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
1148 }
14369a5e6167 Support for frozen scripts; added -i option.
Guido van Rossum <guido@python.org>
parents: 1257
diff changeset
1149
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1150 PyObject *
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1151 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
1152 {
23f280ab5409 Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
1153 WFILE wf;
41653
52533370f1ad Make test_marshal pass. Not my best work. :-(
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
1154 PyObject *res = NULL;
52533370f1ad Make test_marshal pass. Not my best work. :-(
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
1155
4039
23f280ab5409 Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
1156 wf.fp = NULL;
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
1157 wf.str = PyBytes_FromStringAndSize((char *)NULL, 50);
4039
23f280ab5409 Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
1158 if (wf.str == NULL)
23f280ab5409 Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
1159 return NULL;
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
1160 wf.ptr = PyBytes_AS_STRING((PyBytesObject *)wf.str);
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
1161 wf.end = wf.ptr + PyBytes_Size(wf.str);
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
1162 wf.error = WFERR_OK;
13070
7392e71f6cce Michael Hudson <mwh21@cam.ac.uk>:
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
1163 wf.depth = 0;
35008
44e3f21f0525 This is my patch:
Michael W. Hudson <mwh@python.net>
parents: 34413
diff changeset
1164 wf.version = version;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1165 wf.strings = (version > 0) ? PyDict_New() : NULL;
4039
23f280ab5409 Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
1166 w_object(x, &wf);
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1167 Py_XDECREF(wf.strings);
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
1168 if (wf.str != NULL) {
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
1169 char *base = PyBytes_AS_STRING((PyBytesObject *)wf.str);
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
1170 if (wf.ptr - base > PY_SSIZE_T_MAX) {
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
1171 Py_DECREF(wf.str);
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
1172 PyErr_SetString(PyExc_OverflowError,
41595
2c54763c4504 More coding by random modification.
Guido van Rossum <guido@python.org>
parents: 41587
diff changeset
1173 "too much marshal data for a string");
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
1174 return NULL;
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
1175 }
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
1176 if (_PyBytes_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base)) < 0)
41653
52533370f1ad Make test_marshal pass. Not my best work. :-(
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
1177 return NULL;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
1178 }
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
1179 if (wf.error != WFERR_OK) {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1180 Py_XDECREF(wf.str);
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
1181 if (wf.error == WFERR_NOMEMORY)
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
1182 PyErr_NoMemory();
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
1183 else
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
1184 PyErr_SetString(PyExc_ValueError,
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
1185 (wf.error==WFERR_UNMARSHALLABLE)?"unmarshallable object"
ed3f51f2abfb Added handling of PyOS_double_to_string out-of-memory errors. Closes issue 5775.
Eric Smith <eric@trueblade.com>
parents: 53192
diff changeset
1186 :"object too deeply nested to marshal");
4039
23f280ab5409 Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
1187 return NULL;
23f280ab5409 Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
1188 }
41653
52533370f1ad Make test_marshal pass. Not my best work. :-(
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
1189 if (wf.str != NULL) {
52533370f1ad Make test_marshal pass. Not my best work. :-(
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
1190 /* XXX Quick hack -- need to do this differently */
49057
8ffec372040e fixes deferred/release blocker issue #3797: Fixed the dbm, marshal, mmap,
Gregory P. Smith <greg@mad-scientist.com>
parents: 48683
diff changeset
1191 res = PyBytes_FromObject(wf.str);
41653
52533370f1ad Make test_marshal pass. Not my best work. :-(
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
1192 Py_DECREF(wf.str);
52533370f1ad Make test_marshal pass. Not my best work. :-(
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
1193 }
52533370f1ad Make test_marshal pass. Not my best work. :-(
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
1194 return res;
4039
23f280ab5409 Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
1195 }
23f280ab5409 Added *PyMarshal_WriteObjectToString() (moved the relevant code there
Guido van Rossum <guido@python.org>
parents: 3839
diff changeset
1196
279
9c924f9c3b16 Add marshalling for dictionaries.
Guido van Rossum <guido@python.org>
parents: 272
diff changeset
1197 /* And an interface for Python programs... */
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1198
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1199 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
1200 marshal_dump(PyObject *self, PyObject *args)
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1201 {
42071
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1202 /* XXX Quick hack -- need to do this differently */
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1203 PyObject *x;
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1204 PyObject *f;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1205 int version = Py_MARSHAL_VERSION;
42071
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1206 PyObject *s;
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1207 PyObject *res;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1208 if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1209 return NULL;
42071
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1210 s = PyMarshal_WriteObjectToString(x, version);
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1211 if (s == NULL)
3731
de1cb33219e3 Jeremy's patches for more robust handling of unmarshallable types.
Guido van Rossum <guido@python.org>
parents: 3620
diff changeset
1212 return NULL;
42071
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1213 res = PyObject_CallMethod(f, "write", "O", s);
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1214 Py_DECREF(s);
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1215 return res;
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1216 }
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1217
54035
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1218 PyDoc_STRVAR(dump_doc,
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1219 "dump(value, file[, version])\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1220 \n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1221 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
1222 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
1223 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
1224 \n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1225 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
1226 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
1227 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
1228 \n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1229 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
1230
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1231 static PyObject *
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 36866
diff changeset
1232 marshal_load(PyObject *self, PyObject *f)
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1233 {
42071
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1234 /* XXX Quick hack -- need to do this differently */
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1235 PyObject *data, *result;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1236 RFILE rf;
42071
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1237 data = PyObject_CallMethod(f, "read", "");
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1238 if (data == NULL)
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1239 return NULL;
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1240 rf.fp = NULL;
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
1241 if (PyBytes_Check(data)) {
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
1242 rf.ptr = PyBytes_AS_STRING(data);
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47300
diff changeset
1243 rf.end = rf.ptr + PyBytes_GET_SIZE(data);
42071
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1244 }
49057
8ffec372040e fixes deferred/release blocker issue #3797: Fixed the dbm, marshal, mmap,
Gregory P. Smith <greg@mad-scientist.com>
parents: 48683
diff changeset
1245 else if (PyBytes_Check(data)) {
8ffec372040e fixes deferred/release blocker issue #3797: Fixed the dbm, marshal, mmap,
Gregory P. Smith <greg@mad-scientist.com>
parents: 48683
diff changeset
1246 rf.ptr = PyBytes_AS_STRING(data);
8ffec372040e fixes deferred/release blocker issue #3797: Fixed the dbm, marshal, mmap,
Gregory P. Smith <greg@mad-scientist.com>
parents: 48683
diff changeset
1247 rf.end = rf.ptr + PyBytes_GET_SIZE(data);
42071
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1248 }
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1249 else {
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1250 PyErr_Format(PyExc_TypeError,
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1251 "f.read() returned neither string "
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1252 "nor bytes but %.100s",
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1253 data->ob_type->tp_name);
41653
52533370f1ad Make test_marshal pass. Not my best work. :-(
Guido van Rossum <guido@python.org>
parents: 41595
diff changeset
1254 Py_DECREF(data);
42071
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1255 return NULL;
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1256 }
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1257 rf.strings = PyList_New(0);
42404
0c300b29200c Add a missing "rf.depth = 0;" to marshal_load().
Guido van Rossum <guido@python.org>
parents: 42334
diff changeset
1258 rf.depth = 0;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1259 result = read_object(&rf);
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1260 Py_DECREF(rf.strings);
42071
825041fc8e2c Rip out the file object's implementation.
Guido van Rossum <guido@python.org>
parents: 41824
diff changeset
1261 Py_DECREF(data);
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1262 return result;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1263 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1264
54035
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1265 PyDoc_STRVAR(load_doc,
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1266 "load(file)\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1267 \n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1268 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
1269 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
1270 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
1271 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
1272 'r+b').\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1273 \n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1274 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
1275 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
1276
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1277
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1278 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
1279 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
1280 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1281 PyObject *x;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1282 int version = Py_MARSHAL_VERSION;
34205
ea340006c1f3 Back-ported: marshal.dumps() with the new optional argument 'version' just
Armin Rigo <arigo@tunes.org>
parents: 32422
diff changeset
1283 if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1284 return NULL;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1285 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
1286 }
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1287
54035
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1288 PyDoc_STRVAR(dumps_doc,
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1289 "dumps(value[, version])\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1290 \n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1291 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
1292 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
1293 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
1294 \n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1295 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
1296
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1297
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1298 static PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
1299 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
1300 {
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1301 RFILE rf;
48683
cd3b0b7fd8e1 Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48370
diff changeset
1302 Py_buffer p;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1303 char *s;
36792
688795873ff1 Make Py_ssize_t clean.
Thomas Wouters <thomas@python.org>
parents: 36784
diff changeset
1304 Py_ssize_t n;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1305 PyObject* result;
48683
cd3b0b7fd8e1 Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48370
diff changeset
1306 if (!PyArg_ParseTuple(args, "s*:loads", &p))
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1307 return NULL;
48683
cd3b0b7fd8e1 Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48370
diff changeset
1308 s = p.buf;
cd3b0b7fd8e1 Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48370
diff changeset
1309 n = p.len;
1191
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1310 rf.fp = NULL;
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1311 rf.ptr = s;
38f0054f44a7 Added separate main program for the Mac: macmain.c
Guido van Rossum <guido@python.org>
parents: 795
diff changeset
1312 rf.end = s + n;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1313 rf.strings = PyList_New(0);
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41715
diff changeset
1314 rf.depth = 0;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1315 result = read_object(&rf);
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1316 Py_DECREF(rf.strings);
48683
cd3b0b7fd8e1 Merged revisions 65654 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48370
diff changeset
1317 PyBuffer_Release(&p);
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1318 return result;
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1319 }
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1320
54035
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1321 PyDoc_STRVAR(loads_doc,
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1322 "loads(string)\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1323 \n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1324 Convert the string to a value. If no valid value is found, raise\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1325 EOFError, ValueError or TypeError. Extra characters in the string are\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1326 ignored.");
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1327
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5197
diff changeset
1328 static PyMethodDef marshal_methods[] = {
54035
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1329 {"dump", marshal_dump, METH_VARARGS, dump_doc},
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1330 {"load", marshal_load, METH_O, load_doc},
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1331 {"dumps", marshal_dumps, METH_VARARGS, dumps_doc},
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1332 {"loads", marshal_loads, METH_VARARGS, loads_doc},
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1333 {NULL, NULL} /* sentinel */
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1334 };
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1335
54035
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1336
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1337 PyDoc_STRVAR(module_doc,
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1338 "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
1339 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
1340 machine architecture issues.\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1341 \n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1342 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
1343 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
1344 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
1345 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
1346 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
1347 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
1348 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
1349 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
1350 (they will cause infinite loops).\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1351 \n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1352 Variables:\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1353 \n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1354 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
1355 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
1356 uses a binary format for floating point numbers.\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1357 \n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1358 Functions:\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1359 \n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1360 dump() -- write value to a file\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1361 load() -- read value from a file\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1362 dumps() -- write value to a string\n\
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1363 loads() -- read value from a string");
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1364
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1365
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1366
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
1367 static struct PyModuleDef marshalmodule = {
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47343
diff changeset
1368 PyModuleDef_HEAD_INIT,
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47343
diff changeset
1369 "marshal",
54035
19e959626109 Merged revisions 72597 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 53965
diff changeset
1370 module_doc,
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47343
diff changeset
1371 0,
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47343
diff changeset
1372 marshal_methods,
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47343
diff changeset
1373 NULL,
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47343
diff changeset
1374 NULL,
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47343
diff changeset
1375 NULL,
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47343
diff changeset
1376 NULL
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47343
diff changeset
1377 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47343
diff changeset
1378
30311
f003e48f562d Bug #794140: cygwin builds do not embed
Jason Tishler <jason@tishler.net>
parents: 24435
diff changeset
1379 PyMODINIT_FUNC
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13447
diff changeset
1380 PyMarshal_Init(void)
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1381 {
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
1382 PyObject *mod = PyModule_Create(&marshalmodule);
36324
1af7f719ed28 Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35877
diff changeset
1383 if (mod == NULL)
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47343
diff changeset
1384 return NULL;
32422
3df36e2e5ddc Patch #923098: Share interned strings in marshal.
Martin v. Löwis <martin@v.loewis.de>
parents: 32343
diff changeset
1385 PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47343
diff changeset
1386 return mod;
267
457661e47c7b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1387 }