@@ -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