@@ -968,6 +968,40 @@ asBignumObj(PyObject *value)
968968 return result;
969969}
970970
971+ static Tcl_Obj* AsObj(PyObject *value);
972+
973+ static Tcl_Obj*
974+ TupleAsObj(PyObject *value, int wrapped)
975+ {
976+ Tcl_Obj *result = NULL;
977+ Py_ssize_t size = PyTuple_GET_SIZE(value);
978+ if (size == 0) {
979+ return Tcl_NewListObj(0, NULL);
980+ }
981+ if (!CHECK_SIZE(size, sizeof(Tcl_Obj *))) {
982+ PyErr_SetString(PyExc_OverflowError,
983+ wrapped ? "list is too long" : "tuple is too long");
984+ return NULL;
985+ }
986+ Tcl_Obj **argv = (Tcl_Obj **)PyMem_Malloc(((size_t)size) * sizeof(Tcl_Obj *));
987+ if (argv == NULL) {
988+ PyErr_NoMemory();
989+ return NULL;
990+ }
991+ for (Py_ssize_t i = 0; i < size; i++) {
992+ Tcl_Obj *item = AsObj(PyTuple_GET_ITEM(value, i));
993+ if (item == NULL) {
994+ goto exit;
995+ }
996+ argv[i] = item;
997+ }
998+ result = Tcl_NewListObj((int)size, argv);
999+
1000+ exit:
1001+ PyMem_Free(argv);
1002+ return result;
1003+ }
1004+
9711005static Tcl_Obj*
9721006AsObj(PyObject *value)
9731007{
@@ -1014,28 +1048,17 @@ AsObj(PyObject *value)
10141048 if (PyFloat_Check(value))
10151049 return Tcl_NewDoubleObj(PyFloat_AS_DOUBLE(value));
10161050
1017- if (PyTuple_Check(value) || PyList_Check(value)) {
1018- Tcl_Obj **argv;
1019- Py_ssize_t size, i;
1020-
1021- size = PySequence_Fast_GET_SIZE(value);
1022- if (size == 0)
1023- return Tcl_NewListObj(0, NULL);
1024- if (!CHECK_SIZE(size, sizeof(Tcl_Obj *))) {
1025- PyErr_SetString(PyExc_OverflowError,
1026- PyTuple_Check(value) ? "tuple is too long" :
1027- "list is too long");
1051+ if (PyTuple_Check(value)) {
1052+ return TupleAsObj(value, false);
1053+ }
1054+
1055+ if (PyList_Check(value)) {
1056+ PyObject *value_as_tuple = PyList_AsTuple(value);
1057+ if (value_as_tuple == NULL) {
10281058 return NULL;
10291059 }
1030- argv = (Tcl_Obj **) PyMem_Malloc(((size_t)size) * sizeof(Tcl_Obj *));
1031- if (!argv) {
1032- PyErr_NoMemory();
1033- return NULL;
1034- }
1035- for (i = 0; i < size; i++)
1036- argv[i] = AsObj(PySequence_Fast_GET_ITEM(value,i));
1037- result = Tcl_NewListObj((int)size, argv);
1038- PyMem_Free(argv);
1060+ result = TupleAsObj(value_as_tuple, true);
1061+ Py_DECREF(value_as_tuple);
10391062 return result;
10401063 }
10411064
0 commit comments