Issue #21526: Fixed support of new boolean type in Tcl 8.5.

This commit is contained in:
Serhiy Storchaka 2015-04-02 10:58:40 +03:00
commit b452f41cc8
3 changed files with 36 additions and 6 deletions

View File

@ -378,6 +378,21 @@ class TclTest(unittest.TestCase):
if tcl_version >= (8, 5):
check('2**64', True)
def test_booleans(self):
tcl = self.interp
def check(expr, expected):
result = tcl.call('expr', expr)
self.assertEqual(result, expected)
self.assertIsInstance(result, int)
check('true', True)
check('yes', True)
check('on', True)
check('false', False)
check('no', False)
check('off', False)
check('1 < 2', True)
check('1 > 2', False)
def test_passing_values(self):
def passValue(value):
return self.interp.call('set', '_', value)

View File

@ -16,6 +16,8 @@ Core and Builtins
Library
-------
- Issue #21526: Tkinter now supports new boolean type in Tcl 8.5.
- Issue #23836: Fix the faulthandler module to handle reentrant calls to
its signal handlers.
@ -146,8 +148,6 @@ Library
- Issue #23252: Added support for writing ZIP files to unseekable streams.
- 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

View File

@ -998,6 +998,15 @@ AsObj(PyObject *value)
}
}
static PyObject *
fromBoolean(PyObject* tkapp, Tcl_Obj *value)
{
int boolValue;
if (Tcl_GetBooleanFromObj(Tkapp_Interp(tkapp), value, &boolValue) == TCL_ERROR)
return Tkinter_Error(tkapp);
return PyBool_FromLong(boolValue);
}
static PyObject*
FromObj(PyObject* tkapp, Tcl_Obj *value)
{
@ -1011,10 +1020,7 @@ FromObj(PyObject* tkapp, Tcl_Obj *value)
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);
return fromBoolean(tkapp, value);
}
if (value->typePtr == app->ByteArrayType) {
@ -1069,6 +1075,15 @@ FromObj(PyObject* tkapp, Tcl_Obj *value)
Tcl_GetCharLength(value));
}
#if TK_VERSION_HEX >= 0x08050000
if (app->BooleanType == NULL &&
strcmp(value->typePtr->name, "booleanString") == 0) {
/* booleanString type is not registered in Tcl */
app->BooleanType = value->typePtr;
return fromBoolean(tkapp, value);
}
#endif
return newPyTclObject(value);
}