145
145
w_PyLong(const PyLongObject *ob, WFILE *p)
147
Py_ssize_t i, j, n, l;
150
w_byte(TYPE_LONG, p);
151
if (Py_SIZE(ob) == 0) {
156
/* set l to number of base PyLong_MARSHAL_BASE digits */
157
n = ABS(Py_SIZE(ob));
158
l = (n-1) * PyLong_MARSHAL_RATIO;
159
d = ob->ob_digit[n-1];
160
assert(d != 0); /* a PyLong is always normalized */
162
d >>= PyLong_MARSHAL_SHIFT;
165
w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
167
for (i=0; i < n-1; i++) {
169
for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
170
w_short(d & PyLong_MARSHAL_MASK, p);
171
d >>= PyLong_MARSHAL_SHIFT;
175
d = ob->ob_digit[n-1];
177
w_short(d & PyLong_MARSHAL_MASK, p);
178
d >>= PyLong_MARSHAL_SHIFT;
147
Py_ssize_t i, j, n, l;
150
w_byte(TYPE_LONG, p);
151
if (Py_SIZE(ob) == 0) {
156
/* set l to number of base PyLong_MARSHAL_BASE digits */
157
n = ABS(Py_SIZE(ob));
158
l = (n-1) * PyLong_MARSHAL_RATIO;
159
d = ob->ob_digit[n-1];
160
assert(d != 0); /* a PyLong is always normalized */
162
d >>= PyLong_MARSHAL_SHIFT;
165
w_long((long)(Py_SIZE(ob) > 0 ? l : -l), p);
167
for (i=0; i < n-1; i++) {
169
for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
170
w_short(d & PyLong_MARSHAL_MASK, p);
171
d >>= PyLong_MARSHAL_SHIFT;
175
d = ob->ob_digit[n-1];
177
w_short(d & PyLong_MARSHAL_MASK, p);
178
d >>= PyLong_MARSHAL_SHIFT;
183
183
w_object(PyObject *v, WFILE *p)
189
if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
190
p->error = WFERR_NESTEDTOODEEP;
192
else if (v == NULL) {
193
w_byte(TYPE_NULL, p);
195
else if (v == Py_None) {
196
w_byte(TYPE_NONE, p);
198
else if (v == PyExc_StopIteration) {
199
w_byte(TYPE_STOPITER, p);
201
else if (v == Py_Ellipsis) {
202
w_byte(TYPE_ELLIPSIS, p);
204
else if (v == Py_False) {
205
w_byte(TYPE_FALSE, p);
207
else if (v == Py_True) {
208
w_byte(TYPE_TRUE, p);
210
else if (PyLong_CheckExact(v)) {
211
long x = PyLong_AsLong(v);
212
if ((x == -1) && PyErr_Occurred()) {
213
PyLongObject *ob = (PyLongObject *)v;
189
if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
190
p->error = WFERR_NESTEDTOODEEP;
192
else if (v == NULL) {
193
w_byte(TYPE_NULL, p);
195
else if (v == Py_None) {
196
w_byte(TYPE_NONE, p);
198
else if (v == PyExc_StopIteration) {
199
w_byte(TYPE_STOPITER, p);
201
else if (v == Py_Ellipsis) {
202
w_byte(TYPE_ELLIPSIS, p);
204
else if (v == Py_False) {
205
w_byte(TYPE_FALSE, p);
207
else if (v == Py_True) {
208
w_byte(TYPE_TRUE, p);
210
else if (PyLong_CheckExact(v)) {
211
long x = PyLong_AsLong(v);
212
if ((x == -1) && PyErr_Occurred()) {
213
PyLongObject *ob = (PyLongObject *)v;
218
218
#if SIZEOF_LONG > 4
219
long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
221
w_byte(TYPE_INT64, p);
219
long y = Py_ARITHMETIC_RIGHT_SHIFT(long, x, 31);
221
w_byte(TYPE_INT64, p);
232
else if (PyFloat_CheckExact(v)) {
233
if (p->version > 1) {
234
unsigned char buf[8];
235
if (_PyFloat_Pack8(PyFloat_AsDouble(v),
237
p->error = WFERR_UNMARSHALLABLE;
240
w_byte(TYPE_BINARY_FLOAT, p);
241
w_string((char*)buf, 8, p);
244
char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
247
p->error = WFERR_NOMEMORY;
251
w_byte(TYPE_FLOAT, p);
253
w_string(buf, (int)n, p);
232
else if (PyFloat_CheckExact(v)) {
233
if (p->version > 1) {
234
unsigned char buf[8];
235
if (_PyFloat_Pack8(PyFloat_AsDouble(v),
237
p->error = WFERR_UNMARSHALLABLE;
240
w_byte(TYPE_BINARY_FLOAT, p);
241
w_string((char*)buf, 8, p);
244
char *buf = PyOS_double_to_string(PyFloat_AS_DOUBLE(v),
247
p->error = WFERR_NOMEMORY;
251
w_byte(TYPE_FLOAT, p);
253
w_string(buf, (int)n, p);
257
257
#ifndef WITHOUT_COMPLEX
258
else if (PyComplex_CheckExact(v)) {
259
if (p->version > 1) {
260
unsigned char buf[8];
261
if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
263
p->error = WFERR_UNMARSHALLABLE;
266
w_byte(TYPE_BINARY_COMPLEX, p);
267
w_string((char*)buf, 8, p);
268
if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
270
p->error = WFERR_UNMARSHALLABLE;
273
w_string((char*)buf, 8, p);
277
w_byte(TYPE_COMPLEX, p);
278
buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
281
p->error = WFERR_NOMEMORY;
286
w_string(buf, (int)n, p);
288
buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
291
p->error = WFERR_NOMEMORY;
296
w_string(buf, (int)n, p);
258
else if (PyComplex_CheckExact(v)) {
259
if (p->version > 1) {
260
unsigned char buf[8];
261
if (_PyFloat_Pack8(PyComplex_RealAsDouble(v),
263
p->error = WFERR_UNMARSHALLABLE;
266
w_byte(TYPE_BINARY_COMPLEX, p);
267
w_string((char*)buf, 8, p);
268
if (_PyFloat_Pack8(PyComplex_ImagAsDouble(v),
270
p->error = WFERR_UNMARSHALLABLE;
273
w_string((char*)buf, 8, p);
277
w_byte(TYPE_COMPLEX, p);
278
buf = PyOS_double_to_string(PyComplex_RealAsDouble(v),
281
p->error = WFERR_NOMEMORY;
286
w_string(buf, (int)n, p);
288
buf = PyOS_double_to_string(PyComplex_ImagAsDouble(v),
291
p->error = WFERR_NOMEMORY;
296
w_string(buf, (int)n, p);
301
else if (PyBytes_CheckExact(v)) {
302
w_byte(TYPE_STRING, p);
303
n = PyBytes_GET_SIZE(v);
305
/* huge strings are not supported */
307
p->error = WFERR_UNMARSHALLABLE;
311
w_string(PyBytes_AS_STRING(v), (int)n, p);
313
else if (PyUnicode_CheckExact(v)) {
315
utf8 = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(v),
316
PyUnicode_GET_SIZE(v),
320
p->error = WFERR_UNMARSHALLABLE;
323
w_byte(TYPE_UNICODE, p);
324
n = PyBytes_GET_SIZE(utf8);
327
p->error = WFERR_UNMARSHALLABLE;
331
w_string(PyBytes_AS_STRING(utf8), (int)n, p);
334
else if (PyTuple_CheckExact(v)) {
335
w_byte(TYPE_TUPLE, p);
338
for (i = 0; i < n; i++) {
339
w_object(PyTuple_GET_ITEM(v, i), p);
342
else if (PyList_CheckExact(v)) {
343
w_byte(TYPE_LIST, p);
344
n = PyList_GET_SIZE(v);
346
for (i = 0; i < n; i++) {
347
w_object(PyList_GET_ITEM(v, i), p);
350
else if (PyDict_CheckExact(v)) {
352
PyObject *key, *value;
353
w_byte(TYPE_DICT, p);
354
/* This one is NULL object terminated! */
356
while (PyDict_Next(v, &pos, &key, &value)) {
360
w_object((PyObject *)NULL, p);
362
else if (PyAnySet_CheckExact(v)) {
363
PyObject *value, *it;
301
else if (PyBytes_CheckExact(v)) {
302
w_byte(TYPE_STRING, p);
303
n = PyBytes_GET_SIZE(v);
305
/* huge strings are not supported */
307
p->error = WFERR_UNMARSHALLABLE;
311
w_string(PyBytes_AS_STRING(v), (int)n, p);
313
else if (PyUnicode_CheckExact(v)) {
315
utf8 = PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(v),
316
PyUnicode_GET_SIZE(v),
320
p->error = WFERR_UNMARSHALLABLE;
323
w_byte(TYPE_UNICODE, p);
324
n = PyBytes_GET_SIZE(utf8);
327
p->error = WFERR_UNMARSHALLABLE;
331
w_string(PyBytes_AS_STRING(utf8), (int)n, p);
334
else if (PyTuple_CheckExact(v)) {
335
w_byte(TYPE_TUPLE, p);
338
for (i = 0; i < n; i++) {
339
w_object(PyTuple_GET_ITEM(v, i), p);
342
else if (PyList_CheckExact(v)) {
343
w_byte(TYPE_LIST, p);
344
n = PyList_GET_SIZE(v);
346
for (i = 0; i < n; i++) {
347
w_object(PyList_GET_ITEM(v, i), p);
350
else if (PyDict_CheckExact(v)) {
352
PyObject *key, *value;
353
w_byte(TYPE_DICT, p);
354
/* This one is NULL object terminated! */
356
while (PyDict_Next(v, &pos, &key, &value)) {
360
w_object((PyObject *)NULL, p);
362
else if (PyAnySet_CheckExact(v)) {
363
PyObject *value, *it;
365
if (PyObject_TypeCheck(v, &PySet_Type))
368
w_byte(TYPE_FROZENSET, p);
369
n = PyObject_Size(v);
372
p->error = WFERR_UNMARSHALLABLE;
376
it = PyObject_GetIter(v);
379
p->error = WFERR_UNMARSHALLABLE;
382
while ((value = PyIter_Next(it)) != NULL) {
387
if (PyErr_Occurred()) {
389
p->error = WFERR_UNMARSHALLABLE;
393
else if (PyCode_Check(v)) {
394
PyCodeObject *co = (PyCodeObject *)v;
395
w_byte(TYPE_CODE, p);
396
w_long(co->co_argcount, p);
397
w_long(co->co_kwonlyargcount, p);
398
w_long(co->co_nlocals, p);
399
w_long(co->co_stacksize, p);
400
w_long(co->co_flags, p);
401
w_object(co->co_code, p);
402
w_object(co->co_consts, p);
403
w_object(co->co_names, p);
404
w_object(co->co_varnames, p);
405
w_object(co->co_freevars, p);
406
w_object(co->co_cellvars, p);
407
w_object(co->co_filename, p);
408
w_object(co->co_name, p);
409
w_long(co->co_firstlineno, p);
410
w_object(co->co_lnotab, p);
412
else if (PyObject_CheckBuffer(v)) {
413
/* Write unknown buffer-style objects as a string */
415
PyBufferProcs *pb = v->ob_type->tp_as_buffer;
417
if ((*pb->bf_getbuffer)(v, &view, PyBUF_SIMPLE) != 0) {
418
w_byte(TYPE_UNKNOWN, p);
419
p->error = WFERR_UNMARSHALLABLE;
421
w_byte(TYPE_STRING, p);
426
p->error = WFERR_UNMARSHALLABLE;
430
w_string(s, (int)n, p);
431
if (pb->bf_releasebuffer != NULL)
432
(*pb->bf_releasebuffer)(v, &view);
435
w_byte(TYPE_UNKNOWN, p);
436
p->error = WFERR_UNMARSHALLABLE;
365
if (PyObject_TypeCheck(v, &PySet_Type))
368
w_byte(TYPE_FROZENSET, p);
369
n = PyObject_Size(v);
372
p->error = WFERR_UNMARSHALLABLE;
376
it = PyObject_GetIter(v);
379
p->error = WFERR_UNMARSHALLABLE;
382
while ((value = PyIter_Next(it)) != NULL) {
387
if (PyErr_Occurred()) {
389
p->error = WFERR_UNMARSHALLABLE;
393
else if (PyCode_Check(v)) {
394
PyCodeObject *co = (PyCodeObject *)v;
395
w_byte(TYPE_CODE, p);
396
w_long(co->co_argcount, p);
397
w_long(co->co_kwonlyargcount, p);
398
w_long(co->co_nlocals, p);
399
w_long(co->co_stacksize, p);
400
w_long(co->co_flags, p);
401
w_object(co->co_code, p);
402
w_object(co->co_consts, p);
403
w_object(co->co_names, p);
404
w_object(co->co_varnames, p);
405
w_object(co->co_freevars, p);
406
w_object(co->co_cellvars, p);
407
w_object(co->co_filename, p);
408
w_object(co->co_name, p);
409
w_long(co->co_firstlineno, p);
410
w_object(co->co_lnotab, p);
412
else if (PyObject_CheckBuffer(v)) {
413
/* Write unknown buffer-style objects as a string */
415
PyBufferProcs *pb = v->ob_type->tp_as_buffer;
417
if ((*pb->bf_getbuffer)(v, &view, PyBUF_SIMPLE) != 0) {
418
w_byte(TYPE_UNKNOWN, p);
419
p->error = WFERR_UNMARSHALLABLE;
421
w_byte(TYPE_STRING, p);
426
p->error = WFERR_UNMARSHALLABLE;
430
w_string(s, (int)n, p);
431
if (pb->bf_releasebuffer != NULL)
432
(*pb->bf_releasebuffer)(v, &view);
435
w_byte(TYPE_UNKNOWN, p);
436
p->error = WFERR_UNMARSHALLABLE;
441
441
/* version currently has no effect for writing longs. */
443
443
PyMarshal_WriteLongToFile(long x, FILE *fp, int version)
450
wf.version = version;
450
wf.version = version;
455
455
PyMarshal_WriteObjectToFile(PyObject *x, FILE *fp, int version)
461
wf.strings = (version > 0) ? PyDict_New() : NULL;
462
wf.version = version;
464
Py_XDECREF(wf.strings);
461
wf.strings = (version > 0) ? PyDict_New() : NULL;
462
wf.version = version;
464
Py_XDECREF(wf.strings);
467
467
typedef WFILE RFILE; /* Same struct with different invariants */
528
528
static PyObject *
529
529
r_long64(RFILE *p)
531
long lo4 = r_long(p);
532
long hi4 = r_long(p);
531
long lo4 = r_long(p);
532
long hi4 = r_long(p);
533
533
#if SIZEOF_LONG > 4
534
long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
535
return PyLong_FromLong(x);
534
long x = (hi4 << 32) | (lo4 & 0xFFFFFFFFL);
535
return PyLong_FromLong(x);
537
unsigned char buf[8];
539
int is_little_endian = (int)*(char*)&one;
540
if (is_little_endian) {
541
memcpy(buf, &lo4, 4);
542
memcpy(buf+4, &hi4, 4);
545
memcpy(buf, &hi4, 4);
546
memcpy(buf+4, &lo4, 4);
548
return _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
537
unsigned char buf[8];
539
int is_little_endian = (int)*(char*)&one;
540
if (is_little_endian) {
541
memcpy(buf, &lo4, 4);
542
memcpy(buf+4, &hi4, 4);
545
memcpy(buf, &hi4, 4);
546
memcpy(buf+4, &lo4, 4);
548
return _PyLong_FromByteArray(buf, 8, is_little_endian, 1);
552
552
static PyObject *
553
553
r_PyLong(RFILE *p)
556
int size, i, j, md, shorts_in_top_digit;
562
return (PyObject *)_PyLong_New(0);
563
if (n < -INT_MAX || n > INT_MAX) {
564
PyErr_SetString(PyExc_ValueError,
565
"bad marshal data (long size out of range)");
569
size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
570
shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
571
ob = _PyLong_New(size);
574
Py_SIZE(ob) = n > 0 ? size : -size;
576
for (i = 0; i < size-1; i++) {
578
for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
580
if (md < 0 || md > PyLong_MARSHAL_BASE)
582
d += (digit)md << j*PyLong_MARSHAL_SHIFT;
587
for (j=0; j < shorts_in_top_digit; j++) {
589
if (md < 0 || md > PyLong_MARSHAL_BASE)
591
/* topmost marshal digit should be nonzero */
592
if (md == 0 && j == shorts_in_top_digit - 1) {
594
PyErr_SetString(PyExc_ValueError,
595
"bad marshal data (unnormalized long data)");
598
d += (digit)md << j*PyLong_MARSHAL_SHIFT;
600
/* top digit should be nonzero, else the resulting PyLong won't be
602
ob->ob_digit[size-1] = d;
603
return (PyObject *)ob;
556
int size, i, j, md, shorts_in_top_digit;
562
return (PyObject *)_PyLong_New(0);
563
if (n < -INT_MAX || n > INT_MAX) {
564
PyErr_SetString(PyExc_ValueError,
565
"bad marshal data (long size out of range)");
569
size = 1 + (ABS(n) - 1) / PyLong_MARSHAL_RATIO;
570
shorts_in_top_digit = 1 + (ABS(n) - 1) % PyLong_MARSHAL_RATIO;
571
ob = _PyLong_New(size);
574
Py_SIZE(ob) = n > 0 ? size : -size;
576
for (i = 0; i < size-1; i++) {
578
for (j=0; j < PyLong_MARSHAL_RATIO; j++) {
580
if (md < 0 || md > PyLong_MARSHAL_BASE)
582
d += (digit)md << j*PyLong_MARSHAL_SHIFT;
587
for (j=0; j < shorts_in_top_digit; j++) {
589
if (md < 0 || md > PyLong_MARSHAL_BASE)
591
/* topmost marshal digit should be nonzero */
592
if (md == 0 && j == shorts_in_top_digit - 1) {
594
PyErr_SetString(PyExc_ValueError,
595
"bad marshal data (unnormalized long data)");
598
d += (digit)md << j*PyLong_MARSHAL_SHIFT;
600
/* top digit should be nonzero, else the resulting PyLong won't be
602
ob->ob_digit[size-1] = d;
603
return (PyObject *)ob;
606
PyErr_SetString(PyExc_ValueError,
607
"bad marshal data (digit out of range in long)");
606
PyErr_SetString(PyExc_ValueError,
607
"bad marshal data (digit out of range in long)");
612
612
static PyObject *
613
613
r_object(RFILE *p)
615
/* NULL is a valid return value, it does not necessarily means that
616
an exception is set. */
619
int type = r_byte(p);
624
if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
626
PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
633
PyErr_SetString(PyExc_EOFError,
634
"EOF read where object expected");
648
Py_INCREF(PyExc_StopIteration);
649
retval = PyExc_StopIteration;
653
Py_INCREF(Py_Ellipsis);
654
retval = Py_Ellipsis;
668
retval = PyLong_FromLong(r_long(p));
672
retval = r_long64(p);
676
retval = r_PyLong(p);
685
if (n == EOF || r_string(buf, (int)n, p) != n) {
686
PyErr_SetString(PyExc_EOFError,
687
"EOF read where object expected");
691
dx = PyOS_string_to_double(buf, NULL, NULL);
692
if (dx == -1.0 && PyErr_Occurred())
694
retval = PyFloat_FromDouble(dx);
698
case TYPE_BINARY_FLOAT:
700
unsigned char buf[8];
702
if (r_string((char*)buf, 8, p) != 8) {
703
PyErr_SetString(PyExc_EOFError,
704
"EOF read where object expected");
708
x = _PyFloat_Unpack8(buf, 1);
709
if (x == -1.0 && PyErr_Occurred()) {
713
retval = PyFloat_FromDouble(x);
615
/* NULL is a valid return value, it does not necessarily means that
616
an exception is set. */
619
int type = r_byte(p);
624
if (p->depth > MAX_MARSHAL_STACK_DEPTH) {
626
PyErr_SetString(PyExc_ValueError, "recursion limit exceeded");
633
PyErr_SetString(PyExc_EOFError,
634
"EOF read where object expected");
648
Py_INCREF(PyExc_StopIteration);
649
retval = PyExc_StopIteration;
653
Py_INCREF(Py_Ellipsis);
654
retval = Py_Ellipsis;
668
retval = PyLong_FromLong(r_long(p));
672
retval = r_long64(p);
676
retval = r_PyLong(p);
685
if (n == EOF || r_string(buf, (int)n, p) != n) {
686
PyErr_SetString(PyExc_EOFError,
687
"EOF read where object expected");
691
dx = PyOS_string_to_double(buf, NULL, NULL);
692
if (dx == -1.0 && PyErr_Occurred())
694
retval = PyFloat_FromDouble(dx);
698
case TYPE_BINARY_FLOAT:
700
unsigned char buf[8];
702
if (r_string((char*)buf, 8, p) != 8) {
703
PyErr_SetString(PyExc_EOFError,
704
"EOF read where object expected");
708
x = _PyFloat_Unpack8(buf, 1);
709
if (x == -1.0 && PyErr_Occurred()) {
713
retval = PyFloat_FromDouble(x);
717
717
#ifndef WITHOUT_COMPLEX
724
if (n == EOF || r_string(buf, (int)n, p) != n) {
725
PyErr_SetString(PyExc_EOFError,
726
"EOF read where object expected");
730
c.real = PyOS_string_to_double(buf, NULL, NULL);
731
if (c.real == -1.0 && PyErr_Occurred())
734
if (n == EOF || r_string(buf, (int)n, p) != n) {
735
PyErr_SetString(PyExc_EOFError,
736
"EOF read where object expected");
740
c.imag = PyOS_string_to_double(buf, NULL, NULL);
741
if (c.imag == -1.0 && PyErr_Occurred())
743
retval = PyComplex_FromCComplex(c);
724
if (n == EOF || r_string(buf, (int)n, p) != n) {
725
PyErr_SetString(PyExc_EOFError,
726
"EOF read where object expected");
730
c.real = PyOS_string_to_double(buf, NULL, NULL);
731
if (c.real == -1.0 && PyErr_Occurred())
734
if (n == EOF || r_string(buf, (int)n, p) != n) {
735
PyErr_SetString(PyExc_EOFError,
736
"EOF read where object expected");
740
c.imag = PyOS_string_to_double(buf, NULL, NULL);
741
if (c.imag == -1.0 && PyErr_Occurred())
743
retval = PyComplex_FromCComplex(c);
747
case TYPE_BINARY_COMPLEX:
749
unsigned char buf[8];
751
if (r_string((char*)buf, 8, p) != 8) {
752
PyErr_SetString(PyExc_EOFError,
753
"EOF read where object expected");
757
c.real = _PyFloat_Unpack8(buf, 1);
758
if (c.real == -1.0 && PyErr_Occurred()) {
762
if (r_string((char*)buf, 8, p) != 8) {
763
PyErr_SetString(PyExc_EOFError,
764
"EOF read where object expected");
768
c.imag = _PyFloat_Unpack8(buf, 1);
769
if (c.imag == -1.0 && PyErr_Occurred()) {
773
retval = PyComplex_FromCComplex(c);
747
case TYPE_BINARY_COMPLEX:
749
unsigned char buf[8];
751
if (r_string((char*)buf, 8, p) != 8) {
752
PyErr_SetString(PyExc_EOFError,
753
"EOF read where object expected");
757
c.real = _PyFloat_Unpack8(buf, 1);
758
if (c.real == -1.0 && PyErr_Occurred()) {
762
if (r_string((char*)buf, 8, p) != 8) {
763
PyErr_SetString(PyExc_EOFError,
764
"EOF read where object expected");
768
c.imag = _PyFloat_Unpack8(buf, 1);
769
if (c.imag == -1.0 && PyErr_Occurred()) {
773
retval = PyComplex_FromCComplex(c);
780
if (n < 0 || n > INT_MAX) {
781
PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
785
v = PyBytes_FromStringAndSize((char *)NULL, n);
790
if (r_string(PyBytes_AS_STRING(v), (int)n, p) != n) {
792
PyErr_SetString(PyExc_EOFError,
793
"EOF read where object expected");
805
if (n < 0 || n > INT_MAX) {
806
PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
810
buffer = PyMem_NEW(char, n);
811
if (buffer == NULL) {
812
retval = PyErr_NoMemory();
815
if (r_string(buffer, (int)n, p) != n) {
817
PyErr_SetString(PyExc_EOFError,
818
"EOF read where object expected");
822
v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
830
if (n < 0 || n > INT_MAX) {
831
PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
835
v = PyTuple_New((int)n);
840
for (i = 0; i < n; i++) {
843
if (!PyErr_Occurred())
844
PyErr_SetString(PyExc_TypeError,
845
"NULL object in marshal data for tuple");
850
PyTuple_SET_ITEM(v, (int)i, v2);
857
if (n < 0 || n > INT_MAX) {
858
PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
862
v = PyList_New((int)n);
867
for (i = 0; i < n; i++) {
870
if (!PyErr_Occurred())
871
PyErr_SetString(PyExc_TypeError,
872
"NULL object in marshal data for list");
877
PyList_SET_ITEM(v, (int)i, v2);
895
PyDict_SetItem(v, key, val);
899
if (PyErr_Occurred()) {
909
if (n < 0 || n > INT_MAX) {
910
PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
914
v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
919
for (i = 0; i < n; i++) {
922
if (!PyErr_Occurred())
923
PyErr_SetString(PyExc_TypeError,
924
"NULL object in marshal data for set");
929
if (PySet_Add(v, v2) == -1) {
947
PyObject *code = NULL;
948
PyObject *consts = NULL;
949
PyObject *names = NULL;
950
PyObject *varnames = NULL;
951
PyObject *freevars = NULL;
952
PyObject *cellvars = NULL;
953
PyObject *filename = NULL;
954
PyObject *name = NULL;
956
PyObject *lnotab = NULL;
960
/* XXX ignore long->int overflows for now */
961
argcount = (int)r_long(p);
962
kwonlyargcount = (int)r_long(p);
963
nlocals = (int)r_long(p);
964
stacksize = (int)r_long(p);
965
flags = (int)r_long(p);
969
consts = r_object(p);
975
varnames = r_object(p);
976
if (varnames == NULL)
978
freevars = r_object(p);
979
if (freevars == NULL)
981
cellvars = r_object(p);
982
if (cellvars == NULL)
984
filename = r_object(p);
985
if (filename == NULL)
990
firstlineno = (int)r_long(p);
991
lnotab = r_object(p);
995
v = (PyObject *) PyCode_New(
996
argcount, kwonlyargcount,
997
nlocals, stacksize, flags,
998
code, consts, names, varnames,
999
freevars, cellvars, filename, name,
1000
firstlineno, lnotab);
1006
Py_XDECREF(varnames);
1007
Py_XDECREF(freevars);
1008
Py_XDECREF(cellvars);
1009
Py_XDECREF(filename);
1017
/* Bogus data got written, which isn't ideal.
1018
This will let you keep working and recover. */
1019
PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
780
if (n < 0 || n > INT_MAX) {
781
PyErr_SetString(PyExc_ValueError, "bad marshal data (string size out of range)");
785
v = PyBytes_FromStringAndSize((char *)NULL, n);
790
if (r_string(PyBytes_AS_STRING(v), (int)n, p) != n) {
792
PyErr_SetString(PyExc_EOFError,
793
"EOF read where object expected");
805
if (n < 0 || n > INT_MAX) {
806
PyErr_SetString(PyExc_ValueError, "bad marshal data (unicode size out of range)");
810
buffer = PyMem_NEW(char, n);
811
if (buffer == NULL) {
812
retval = PyErr_NoMemory();
815
if (r_string(buffer, (int)n, p) != n) {
817
PyErr_SetString(PyExc_EOFError,
818
"EOF read where object expected");
822
v = PyUnicode_DecodeUTF8(buffer, n, "surrogatepass");
830
if (n < 0 || n > INT_MAX) {
831
PyErr_SetString(PyExc_ValueError, "bad marshal data (tuple size out of range)");
835
v = PyTuple_New((int)n);
840
for (i = 0; i < n; i++) {
843
if (!PyErr_Occurred())
844
PyErr_SetString(PyExc_TypeError,
845
"NULL object in marshal data for tuple");
850
PyTuple_SET_ITEM(v, (int)i, v2);
857
if (n < 0 || n > INT_MAX) {
858
PyErr_SetString(PyExc_ValueError, "bad marshal data (list size out of range)");
862
v = PyList_New((int)n);
867
for (i = 0; i < n; i++) {
870
if (!PyErr_Occurred())
871
PyErr_SetString(PyExc_TypeError,
872
"NULL object in marshal data for list");
877
PyList_SET_ITEM(v, (int)i, v2);
895
PyDict_SetItem(v, key, val);
899
if (PyErr_Occurred()) {
909
if (n < 0 || n > INT_MAX) {
910
PyErr_SetString(PyExc_ValueError, "bad marshal data (set size out of range)");
914
v = (type == TYPE_SET) ? PySet_New(NULL) : PyFrozenSet_New(NULL);
919
for (i = 0; i < n; i++) {
922
if (!PyErr_Occurred())
923
PyErr_SetString(PyExc_TypeError,
924
"NULL object in marshal data for set");
929
if (PySet_Add(v, v2) == -1) {
947
PyObject *code = NULL;
948
PyObject *consts = NULL;
949
PyObject *names = NULL;
950
PyObject *varnames = NULL;
951
PyObject *freevars = NULL;
952
PyObject *cellvars = NULL;
953
PyObject *filename = NULL;
954
PyObject *name = NULL;
956
PyObject *lnotab = NULL;
960
/* XXX ignore long->int overflows for now */
961
argcount = (int)r_long(p);
962
kwonlyargcount = (int)r_long(p);
963
nlocals = (int)r_long(p);
964
stacksize = (int)r_long(p);
965
flags = (int)r_long(p);
969
consts = r_object(p);
975
varnames = r_object(p);
976
if (varnames == NULL)
978
freevars = r_object(p);
979
if (freevars == NULL)
981
cellvars = r_object(p);
982
if (cellvars == NULL)
984
filename = r_object(p);
985
if (filename == NULL)
990
firstlineno = (int)r_long(p);
991
lnotab = r_object(p);
995
v = (PyObject *) PyCode_New(
996
argcount, kwonlyargcount,
997
nlocals, stacksize, flags,
998
code, consts, names, varnames,
999
freevars, cellvars, filename, name,
1000
firstlineno, lnotab);
1006
Py_XDECREF(varnames);
1007
Py_XDECREF(freevars);
1008
Py_XDECREF(cellvars);
1009
Py_XDECREF(filename);
1017
/* Bogus data got written, which isn't ideal.
1018
This will let you keep working and recover. */
1019
PyErr_SetString(PyExc_ValueError, "bad marshal data (unknown type code)");
1028
1028
static PyObject *
1029
1029
read_object(RFILE *p)
1032
if (PyErr_Occurred()) {
1033
fprintf(stderr, "XXX readobject called with exception set\n");
1037
if (v == NULL && !PyErr_Occurred())
1038
PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1032
if (PyErr_Occurred()) {
1033
fprintf(stderr, "XXX readobject called with exception set\n");
1037
if (v == NULL && !PyErr_Occurred())
1038
PyErr_SetString(PyExc_TypeError, "NULL object in marshal data for object");
1043
1043
PyMarshal_ReadShortFromFile(FILE *fp)
1049
rf.end = rf.ptr = NULL;
1050
return r_short(&rf);
1049
rf.end = rf.ptr = NULL;
1050
return r_short(&rf);
1054
1054
PyMarshal_ReadLongFromFile(FILE *fp)
1059
rf.ptr = rf.end = NULL;
1059
rf.ptr = rf.end = NULL;
1063
1063
#ifdef HAVE_FSTAT