]> granicus.if.org Git - python/commitdiff
Convert tcl objects to strings in getvar/setvar. Fixes #730506.
authorMartin v. Löwis <martin@v.loewis.de>
Thu, 1 May 2003 05:47:00 +0000 (05:47 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Thu, 1 May 2003 05:47:00 +0000 (05:47 +0000)
Modules/_tkinter.c

index c946f88c0faadeea2b8884c0c269db2ebb5043e2..e1238d691326f21ff833c9e040ba87044d54cfe0 100644 (file)
@@ -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