]> granicus.if.org Git - python/commitdiff
Issue #21526: Tkinter now supports new boolean type in Tcl 8.5.
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 22 Mar 2015 22:47:45 +0000 (00:47 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Sun, 22 Mar 2015 22:47:45 +0000 (00:47 +0200)
Misc/NEWS
Modules/_tkinter.c

index c832e5e01b9f31b45c9de2fbf9eae4ff9f7ba9e0..590f0a56e9eb2cf3c2aec7bfcfe30b077e5d76ec 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -23,6 +23,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #21526: Tkinter now supports new boolean type in Tcl 8.5.
+
 - Issue #23647: Increase impalib's MAXLINE to accommodate modern mailbox sizes.
 
 - Issue #23539: If body is None, http.client.HTTPConnection.request now sets
index 52069ec8b9e72d05481e1ecda2f712d286f7641c..4bced69682097f0fad62a7d8fe2dc932be63dc49 100644 (file)
@@ -229,6 +229,7 @@ typedef struct {
     int dispatching;
     /* We cannot include tclInt.h, as this is internal.
        So we cache interesting types here. */
+    const Tcl_ObjType *OldBooleanType;
     const Tcl_ObjType *BooleanType;
     const Tcl_ObjType *ByteArrayType;
     const Tcl_ObjType *DoubleType;
@@ -585,7 +586,8 @@ Tkapp_New(const char *screenName, const char *className,
     }
 #endif
 
-    v->BooleanType = Tcl_GetObjType("boolean");
+    v->OldBooleanType = Tcl_GetObjType("boolean");
+    v->BooleanType = Tcl_GetObjType("booleanString");
     v->ByteArrayType = Tcl_GetObjType("bytearray");
     v->DoubleType = Tcl_GetObjType("double");
     v->IntType = Tcl_GetObjType("int");
@@ -1001,15 +1003,18 @@ FromObj(PyObject* tkapp, Tcl_Obj *value)
 {
     PyObject *result = NULL;
     TkappObject *app = (TkappObject*)tkapp;
+    Tcl_Interp *interp = Tkapp_Interp(tkapp);
 
     if (value->typePtr == NULL) {
         return unicodeFromTclStringAndSize(value->bytes, value->length);
     }
 
-    if (value->typePtr == app->BooleanType) {
-        result = value->internalRep.longValue ? Py_True : Py_False;
-        Py_INCREF(result);
-        return result;
+    if (value->typePtr == app->BooleanType ||
+        value->typePtr == app->OldBooleanType) {
+        int boolValue;
+        if (Tcl_GetBooleanFromObj(interp, value, &boolValue) == TCL_ERROR)
+            return Tkinter_Error(tkapp);
+        return PyBool_FromLong(boolValue);
     }
 
     if (value->typePtr == app->ByteArrayType) {
@@ -1032,15 +1037,14 @@ FromObj(PyObject* tkapp, Tcl_Obj *value)
         PyObject *elem;
         Tcl_Obj *tcl_elem;
 
-        status = Tcl_ListObjLength(Tkapp_Interp(tkapp), value, &size);
+        status = Tcl_ListObjLength(interp, value, &size);
         if (status == TCL_ERROR)
             return Tkinter_Error(tkapp);
         result = PyTuple_New(size);
         if (!result)
             return NULL;
         for (i = 0; i < size; i++) {
-            status = Tcl_ListObjIndex(Tkapp_Interp(tkapp),
-                                      value, i, &tcl_elem);
+            status = Tcl_ListObjIndex(interp, value, i, &tcl_elem);
             if (status == TCL_ERROR) {
                 Py_DECREF(result);
                 return Tkinter_Error(tkapp);