diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2003-05-01 05:47:00 +0000 |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2003-05-01 05:47:00 +0000 |
commit | 1869ec5cb71cd6af1c495d136b1ee5aaaebf9fbb (patch) | |
tree | 56d8f9405ad713b0ed76642b5524c55581a411fd /Modules/_tkinter.c | |
parent | 9e29625a1b679dfcf2d5bf9957f4efb669602f74 (diff) | |
download | cpython-git-1869ec5cb71cd6af1c495d136b1ee5aaaebf9fbb.tar.gz |
Convert tcl objects to strings in getvar/setvar. Fixes #730506.
Diffstat (limited to 'Modules/_tkinter.c')
-rw-r--r-- | Modules/_tkinter.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index c946f88c0f..e1238d6913 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -742,6 +742,12 @@ PyTclObject_str(PyTclObject *self) return PyString_FromString(Tcl_GetString(self->value)); } +static char* +PyTclObject_TclString(PyObject *self) +{ + return Tcl_GetString(((PyTclObject*)self)->value); +} + /* Like _str, but create Unicode if necessary. */ PyDoc_STRVAR(PyTclObject_string__doc__, "the string representation of this object, either as string or Unicode"); @@ -1466,6 +1472,22 @@ typedef struct VarEvent { Tcl_Condition cond; } VarEvent; +static int +varname_converter(PyObject *in, void *_out) +{ + char **out = (char**)_out; + if (PyString_Check(in)) { + *out = PyString_AsString(in); + return 1; + } + if (PyTclObject_Check(in)) { + *out = PyTclObject_TclString(in); + return 1; + } + /* XXX: Should give diagnostics. */ + return 0; +} + void var_perform(VarEvent *ev) { @@ -1542,7 +1564,8 @@ SetVar(PyObject *self, PyObject *args, int flags) PyObject *res = NULL; Tcl_Obj *newval, *ok; - if (PyArg_ParseTuple(args, "sO:setvar", &name1, &newValue)) { + if (PyArg_ParseTuple(args, "O&O:setvar", + varname_converter, &name1, &newValue)) { /* XXX Acquire tcl lock??? */ newval = AsObj(newValue); if (newval == NULL) @@ -1604,7 +1627,8 @@ GetVar(PyObject *self, PyObject *args, int flags) PyObject *res = NULL; Tcl_Obj *tres; - if (!PyArg_ParseTuple(args, "s|s:getvar", &name1, &name2)) + if (!PyArg_ParseTuple(args, "O&|s:getvar", + varname_converter, &name1, &name2)) return NULL; ENTER_TCL |