@@ -946,6 +946,40 @@ asBignumObj(PyObject *value)
946946 return result ;
947947}
948948
949+ static Tcl_Obj * AsObj (PyObject * value );
950+
951+ static Tcl_Obj *
952+ TupleAsObj (PyObject * value , int wrapped )
953+ {
954+ Tcl_Obj * result = NULL ;
955+ Py_ssize_t size = PyTuple_GET_SIZE (value );
956+ if (size == 0 ) {
957+ return Tcl_NewListObj (0 , NULL );
958+ }
959+ if (!CHECK_SIZE (size , sizeof (Tcl_Obj * ))) {
960+ PyErr_SetString (PyExc_OverflowError ,
961+ wrapped ? "list is too long" : "tuple is too long" );
962+ return NULL ;
963+ }
964+ Tcl_Obj * * argv = (Tcl_Obj * * )PyMem_Malloc (((size_t )size ) * sizeof (Tcl_Obj * ));
965+ if (argv == NULL ) {
966+ PyErr_NoMemory ();
967+ return NULL ;
968+ }
969+ for (Py_ssize_t i = 0 ; i < size ; i ++ ) {
970+ Tcl_Obj * item = AsObj (PyTuple_GET_ITEM (value , i ));
971+ if (item == NULL ) {
972+ goto exit ;
973+ }
974+ argv [i ] = item ;
975+ }
976+ result = Tcl_NewListObj ((int )size , argv );
977+
978+ exit :
979+ PyMem_Free (argv );
980+ return result ;
981+ }
982+
949983static Tcl_Obj *
950984AsObj (PyObject * value )
951985{
@@ -992,28 +1026,17 @@ AsObj(PyObject *value)
9921026 if (PyFloat_Check (value ))
9931027 return Tcl_NewDoubleObj (PyFloat_AS_DOUBLE (value ));
9941028
995- if (PyTuple_Check (value ) || PyList_Check (value )) {
996- Tcl_Obj * * argv ;
997- Py_ssize_t size , i ;
998-
999- size = PySequence_Fast_GET_SIZE (value );
1000- if (size == 0 )
1001- return Tcl_NewListObj (0 , NULL );
1002- if (!CHECK_SIZE (size , sizeof (Tcl_Obj * ))) {
1003- PyErr_SetString (PyExc_OverflowError ,
1004- PyTuple_Check (value ) ? "tuple is too long" :
1005- "list is too long" );
1029+ if (PyTuple_Check (value )) {
1030+ return TupleAsObj (value , false);
1031+ }
1032+
1033+ if (PyList_Check (value )) {
1034+ PyObject * value_as_tuple = PyList_AsTuple (value );
1035+ if (value_as_tuple == NULL ) {
10061036 return NULL ;
10071037 }
1008- argv = (Tcl_Obj * * ) PyMem_Malloc (((size_t )size ) * sizeof (Tcl_Obj * ));
1009- if (!argv ) {
1010- PyErr_NoMemory ();
1011- return NULL ;
1012- }
1013- for (i = 0 ; i < size ; i ++ )
1014- argv [i ] = AsObj (PySequence_Fast_GET_ITEM (value ,i ));
1015- result = Tcl_NewListObj ((int )size , argv );
1016- PyMem_Free (argv );
1038+ result = TupleAsObj (value_as_tuple , true);
1039+ Py_DECREF (value_as_tuple );
10171040 return result ;
10181041 }
10191042
0 commit comments