@@ -493,24 +493,28 @@ unicodeFromTclString(const char *s)
493493}
494494
495495static PyObject *
496- unicodeFromTclObj (Tcl_Obj * value )
496+ unicodeFromTclObj (TkappObject * tkapp , Tcl_Obj * value )
497497{
498498 Tcl_Size len ;
499499#if USE_TCL_UNICODE
500- int byteorder = NATIVE_BYTEORDER ;
501- const Tcl_UniChar * u = Tcl_GetUnicodeFromObj (value , & len );
502- if (sizeof (Tcl_UniChar ) == 2 )
503- return PyUnicode_DecodeUTF16 ((const char * )u , len * 2 ,
504- "surrogatepass" , & byteorder );
505- else if (sizeof (Tcl_UniChar ) == 4 )
506- return PyUnicode_DecodeUTF32 ((const char * )u , len * 4 ,
507- "surrogatepass" , & byteorder );
508- else
509- Py_UNREACHABLE ();
510- #else
500+ if (value -> typePtr != NULL && tkapp != NULL &&
501+ (value -> typePtr == tkapp -> StringType ||
502+ value -> typePtr == tkapp -> UTF32StringType ))
503+ {
504+ int byteorder = NATIVE_BYTEORDER ;
505+ const Tcl_UniChar * u = Tcl_GetUnicodeFromObj (value , & len );
506+ if (sizeof (Tcl_UniChar ) == 2 )
507+ return PyUnicode_DecodeUTF16 ((const char * )u , len * 2 ,
508+ "surrogatepass" , & byteorder );
509+ else if (sizeof (Tcl_UniChar ) == 4 )
510+ return PyUnicode_DecodeUTF32 ((const char * )u , len * 4 ,
511+ "surrogatepass" , & byteorder );
512+ else
513+ Py_UNREACHABLE ();
514+ }
515+ #endif
511516 const char * s = Tcl_GetStringFromObj (value , & len );
512517 return unicodeFromTclStringAndSize (s , len );
513- #endif
514518}
515519
516520/*[clinic input]
@@ -793,7 +797,7 @@ PyTclObject_string(PyObject *_self, void *ignored)
793797{
794798 PyTclObject * self = (PyTclObject * )_self ;
795799 if (!self -> string ) {
796- self -> string = unicodeFromTclObj (self -> value );
800+ self -> string = unicodeFromTclObj (NULL , self -> value );
797801 if (!self -> string )
798802 return NULL ;
799803 }
@@ -808,7 +812,7 @@ PyTclObject_str(PyObject *_self)
808812 return Py_NewRef (self -> string );
809813 }
810814 /* XXX Could cache result if it is non-ASCII. */
811- return unicodeFromTclObj (self -> value );
815+ return unicodeFromTclObj (NULL , self -> value );
812816}
813817
814818static PyObject *
@@ -1143,7 +1147,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value)
11431147 Tcl_Interp * interp = Tkapp_Interp (tkapp );
11441148
11451149 if (value -> typePtr == NULL ) {
1146- return unicodeFromTclObj (value );
1150+ return unicodeFromTclObj (tkapp , value );
11471151 }
11481152
11491153 if (value -> typePtr == tkapp -> BooleanType ||
@@ -1208,7 +1212,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value)
12081212 if (value -> typePtr == tkapp -> StringType ||
12091213 value -> typePtr == tkapp -> UTF32StringType )
12101214 {
1211- return unicodeFromTclObj (value );
1215+ return unicodeFromTclObj (tkapp , value );
12121216 }
12131217
12141218 if (tkapp -> BignumType == NULL &&
@@ -1308,7 +1312,7 @@ Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, Tcl_Size *pobjc)
13081312static PyObject *
13091313Tkapp_UnicodeResult (TkappObject * self )
13101314{
1311- return unicodeFromTclObj (Tcl_GetObjResult (self -> interp ));
1315+ return unicodeFromTclObj (self , Tcl_GetObjResult (self -> interp ));
13121316}
13131317
13141318
@@ -1327,7 +1331,7 @@ Tkapp_ObjectResult(TkappObject *self)
13271331 res = FromObj (self , value );
13281332 Tcl_DecrRefCount (value );
13291333 } else {
1330- res = unicodeFromTclObj (value );
1334+ res = unicodeFromTclObj (self , value );
13311335 }
13321336 return res ;
13331337}
@@ -1860,7 +1864,7 @@ GetVar(TkappObject *self, PyObject *args, int flags)
18601864 res = FromObj (self , tres );
18611865 }
18621866 else {
1863- res = unicodeFromTclObj (tres );
1867+ res = unicodeFromTclObj (self , tres );
18641868 }
18651869 }
18661870 LEAVE_OVERLAP_TCL
@@ -2307,7 +2311,7 @@ PythonCmd(ClientData clientData, Tcl_Interp *interp,
23072311
23082312 for (i = 0 ; i < (objc - 1 ); i ++ ) {
23092313 PyObject * s = objargs ? FromObj (data -> self , objv [i + 1 ])
2310- : unicodeFromTclObj (objv [i + 1 ]);
2314+ : unicodeFromTclObj (data -> self , objv [i + 1 ]);
23112315 if (!s ) {
23122316 Py_DECREF (args );
23132317 return PythonCmd_Error (interp );
0 commit comments