[Python-3000-checkins] r58285 - in python/branches/py3k-importlib: NEWS Python/marshal.c
brett.cannon
python-3000-checkins at python.org
Sat Sep 29 08:53:03 CEST 2007
Author: brett.cannon
Date: Sat Sep 29 08:53:02 2007
New Revision: 58285
Modified:
python/branches/py3k-importlib/NEWS
python/branches/py3k-importlib/Python/marshal.c
Log:
Ditch own implementation for _r_long and _w_long for ones that 'marshal' has.
Modified: python/branches/py3k-importlib/NEWS
==============================================================================
--- python/branches/py3k-importlib/NEWS (original)
+++ python/branches/py3k-importlib/NEWS Sat Sep 29 08:53:02 2007
@@ -1,3 +1,5 @@
+* Add _r_long() and _w_long() to marshal.
+
* Add _case_ok() to imp.
* Add _PyImport_Importlib() to import _importlib. This also involves importing
Modified: python/branches/py3k-importlib/Python/marshal.c
==============================================================================
--- python/branches/py3k-importlib/Python/marshal.c (original)
+++ python/branches/py3k-importlib/Python/marshal.c Sat Sep 29 08:53:02 2007
@@ -1230,11 +1230,76 @@
return result;
}
+static PyObject *
+marshal_r_long(PyObject *self, PyObject *obj)
+{
+ RFILE rf;
+ PyObject *bytes;
+ long long_result;
+ PyObject *obj_result = NULL; /* Almost always used as return value. */
+
+ /* Get a bytes object. */
+ bytes = PyBytes_FromObject(obj);
+ if (!bytes)
+ return NULL;
+
+ /* Make sure it is the right length. */
+ if (PyBytes_Size(bytes) != 4) {
+ PyErr_SetString(PyExc_ValueError,
+ "Expected bytes of length 4");
+ goto exit;
+ }
+
+ /* Set the RFILE to not be used as an fp. */
+ rf.fp = NULL;
+ /* Use the bytes object as a 'char *' directly. */
+ rf.ptr = PyBytes_AS_STRING(bytes);
+ rf.end = rf.ptr + 4;
+
+ long_result = r_long(&rf);
+
+ obj_result = PyInt_FromLong(long_result);
+
+ exit:
+ Py_DECREF(bytes);
+ return obj_result;
+}
+
+static PyObject *
+marshal_w_long(PyObject *self, PyObject *obj)
+{
+ WFILE wf;
+ PyObject *bytes = NULL;
+ long value;
+
+ /* Get the long value of the argument. */
+ value = PyInt_AsLong(obj);
+ if ((value == -1) && PyErr_Occurred())
+ return NULL;
+
+ /* Create a bytes object. */
+ bytes = PyBytes_FromStringAndSize("0000", 4);
+ if (!bytes)
+ return NULL;
+
+ /* Write the long value into the bytes object. */
+ wf.fp = NULL;
+ wf.ptr = PyBytes_AS_STRING(bytes);
+ wf.end = wf.ptr + 4;
+
+ w_long(value, &wf);
+
+ return bytes;
+}
+
+
static PyMethodDef marshal_methods[] = {
{"dump", marshal_dump, METH_VARARGS},
{"load", marshal_load, METH_O},
{"dumps", marshal_dumps, METH_VARARGS},
{"loads", marshal_loads, METH_VARARGS},
+ {"_r_long", marshal_r_long, METH_O},
+ {"_w_long", marshal_w_long, METH_O},
{NULL, NULL} /* sentinel */
};
More information about the Python-3000-checkins
mailing list