From 41cfce9c2bcfe6153ee2b42e05ff1d782d1d3b91 Mon Sep 17 00:00:00 2001 From: Skip Montanaro Date: Fri, 24 Aug 2007 21:11:00 +0000 Subject: [PATCH] Remove PyArg_Parse usage from time module. (An extra set of eyeballs on this would be nice. I'm a little rusty.) --- Include/structseq.h | 4 +++ Modules/timemodule.c | 61 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 10 deletions(-) diff --git a/Include/structseq.h b/Include/structseq.h index e662916fe4c..a482bd8491a 100644 --- a/Include/structseq.h +++ b/Include/structseq.h @@ -35,6 +35,10 @@ typedef struct { #define PyStructSequence_SET_ITEM(op, i, v) \ (((PyStructSequence *)(op))->ob_item[i] = v) +#define PyStructSequence_GET_ITEM(op, i) \ + (((PyStructSequence *)(op))->ob_item[i]) + + #ifdef __cplusplus } #endif diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 8ce6667cb60..c7acf3a9b54 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -254,6 +254,29 @@ tmtotuple(struct tm *p) return v; } +static PyObject * +structtime_totuple(PyObject *t) +{ + PyObject *x = NULL; + unsigned int i; + PyObject *v = PyTuple_New(9); + if (v == NULL) + return NULL; + + for (i=0; i<9; i++) { + x = PyStructSequence_GET_ITEM(t, i); + Py_INCREF(x); + PyTuple_SET_ITEM(v, i, x); + } + + if (PyErr_Occurred()) { + Py_XDECREF(v); + return NULL; + } + + return v; +} + static PyObject * time_convert(double when, struct tm * (*function)(const time_t *)) { @@ -332,18 +355,36 @@ gettmarg(PyObject *args, struct tm *p) { int y; memset((void *) p, '\0', sizeof(struct tm)); + PyObject *t = NULL; - if (!PyArg_Parse(args, "(iiiiiiiii)", - &y, - &p->tm_mon, - &p->tm_mday, - &p->tm_hour, - &p->tm_min, - &p->tm_sec, - &p->tm_wday, - &p->tm_yday, - &p->tm_isdst)) + if (PyTuple_Check(args)) { + t = args; + Py_INCREF(t); + } + else if (Py_Type(args) == &StructTimeType) { + t = structtime_totuple(args); + } + else { + PyErr_SetString(PyExc_TypeError, + "Tuple or struct_time argument required"); return 0; + } + + if (t == NULL || !PyArg_ParseTuple(t, "iiiiiiiii", + &y, + &p->tm_mon, + &p->tm_mday, + &p->tm_hour, + &p->tm_min, + &p->tm_sec, + &p->tm_wday, + &p->tm_yday, + &p->tm_isdst)) { + Py_XDECREF(t); + return 0; + } + Py_DECREF(t); + if (y < 1900) { PyObject *accept = PyDict_GetItemString(moddict, "accept2dyear");