1155 lines · 24.5 KB · C
RawDownload
	RFILE rf;	PyObject *result;	rf.fp = fp;	rf.strings = PyList_New(0);	result = r_object(&rf);	Py_DECREF(rf.strings);	return result;} PyObject *PyMarshal_ReadObjectFromString(char *str, Py_ssize_t len){	RFILE rf;	PyObject *result;	rf.fp = NULL;	rf.ptr = str;	rf.end = str + len;	rf.strings = PyList_New(0);	result = r_object(&rf);	Py_DECREF(rf.strings);	return result;} PyObject *PyMarshal_WriteObjectToString(PyObject *x, int version){	WFILE wf;	wf.fp = NULL;	wf.str = PyString_FromStringAndSize((char *)NULL, 50);	if (wf.str == NULL)		return NULL;	wf.ptr = PyString_AS_STRING((PyStringObject *)wf.str);	wf.end = wf.ptr + PyString_Size(wf.str);	wf.error = 0;	wf.depth = 0;	wf.version = version;	wf.strings = (version > 0) ? PyDict_New() : NULL;	w_object(x, &wf);	Py_XDECREF(wf.strings);	if (wf.str != NULL) {		char *base = PyString_AS_STRING((PyStringObject *)wf.str);		if (wf.ptr - base > PY_SSIZE_T_MAX) {			Py_DECREF(wf.str);			PyErr_SetString(PyExc_OverflowError,					"too much marshall data for a string");			return NULL;		}		_PyString_Resize(&wf.str, (Py_ssize_t)(wf.ptr - base));	}	if (wf.error) {		Py_XDECREF(wf.str);		PyErr_SetString(PyExc_ValueError,				(wf.error==1)?"unmarshallable object"				:"object too deeply nested to marshal");		return NULL;	}	return wf.str;} /* And an interface for Python programs... */ static PyObject *marshal_dump(PyObject *self, PyObject *args){	WFILE wf;	PyObject *x;	PyObject *f;	int version = Py_MARSHAL_VERSION;	if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))		return NULL;	if (!PyFile_Check(f)) {		PyErr_SetString(PyExc_TypeError,				"marshal.dump() 2nd arg must be file");		return NULL;	}	wf.fp = PyFile_AsFile(f);	wf.str = NULL;	wf.ptr = wf.end = NULL;	wf.error = 0;	wf.depth = 0;	wf.strings = (version > 0) ? PyDict_New() : 0;	wf.version = version;	w_object(x, &wf);	Py_XDECREF(wf.strings);	if (wf.error) {		PyErr_SetString(PyExc_ValueError,				(wf.error==1)?"unmarshallable object"				:"object too deeply nested to marshal");		return NULL;	}	Py_INCREF(Py_None);	return Py_None;} static PyObject *marshal_load(PyObject *self, PyObject *f){	RFILE rf;	PyObject *result;	if (!PyFile_Check(f)) {		PyErr_SetString(PyExc_TypeError,				"marshal.load() arg must be file");		return NULL;	}	rf.fp = PyFile_AsFile(f);	rf.strings = PyList_New(0);	result = read_object(&rf);	Py_DECREF(rf.strings);	return result;} static PyObject *marshal_dumps(PyObject *self, PyObject *args){	PyObject *x;	int version = Py_MARSHAL_VERSION;	if (!PyArg_ParseTuple(args, "O|i:dumps", &x, &version))		return NULL;	return PyMarshal_WriteObjectToString(x, version);} static PyObject *marshal_loads(PyObject *self, PyObject *args){	RFILE rf;	char *s;	Py_ssize_t n;	PyObject* result;	if (!PyArg_ParseTuple(args, "s#:loads", &s, &n))		return NULL;	rf.fp = NULL;	rf.ptr = s;	rf.end = s + n;	rf.strings = PyList_New(0);	result = read_object(&rf);	Py_DECREF(rf.strings);	return result;} static PyMethodDef marshal_methods[] = {	{"dump",	marshal_dump,	METH_VARARGS},	{"load",	marshal_load,	METH_O},	{"dumps",	marshal_dumps,	METH_VARARGS},	{"loads",	marshal_loads,	METH_VARARGS},	{NULL,		NULL}		/* sentinel */}; PyMODINIT_FUNCPyMarshal_Init(void){	PyObject *mod = Py_InitModule("marshal", marshal_methods);	if (mod == NULL)		return;	PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);}

Lines 1001–1155 of 1155. Previous lines