@@ -493,24 +493,28 @@ unicodeFromTclString(const char *s)
493
493
}
494
494
495
495
static PyObject *
496
- unicodeFromTclObj (Tcl_Obj * value )
496
+ unicodeFromTclObj (TkappObject * tkapp , Tcl_Obj * value )
497
497
{
498
498
Tcl_Size len ;
499
499
#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
511
516
const char * s = Tcl_GetStringFromObj (value , & len );
512
517
return unicodeFromTclStringAndSize (s , len );
513
- #endif
514
518
}
515
519
516
520
/*[clinic input]
@@ -793,7 +797,7 @@ PyTclObject_string(PyObject *_self, void *ignored)
793
797
{
794
798
PyTclObject * self = (PyTclObject * )_self ;
795
799
if (!self -> string ) {
796
- self -> string = unicodeFromTclObj (self -> value );
800
+ self -> string = unicodeFromTclObj (NULL , self -> value );
797
801
if (!self -> string )
798
802
return NULL ;
799
803
}
@@ -808,7 +812,7 @@ PyTclObject_str(PyObject *_self)
808
812
return Py_NewRef (self -> string );
809
813
}
810
814
/* XXX Could cache result if it is non-ASCII. */
811
- return unicodeFromTclObj (self -> value );
815
+ return unicodeFromTclObj (NULL , self -> value );
812
816
}
813
817
814
818
static PyObject *
@@ -1143,7 +1147,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value)
1143
1147
Tcl_Interp * interp = Tkapp_Interp (tkapp );
1144
1148
1145
1149
if (value -> typePtr == NULL ) {
1146
- return unicodeFromTclObj (value );
1150
+ return unicodeFromTclObj (tkapp , value );
1147
1151
}
1148
1152
1149
1153
if (value -> typePtr == tkapp -> BooleanType ||
@@ -1208,7 +1212,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value)
1208
1212
if (value -> typePtr == tkapp -> StringType ||
1209
1213
value -> typePtr == tkapp -> UTF32StringType )
1210
1214
{
1211
- return unicodeFromTclObj (value );
1215
+ return unicodeFromTclObj (tkapp , value );
1212
1216
}
1213
1217
1214
1218
if (tkapp -> BignumType == NULL &&
@@ -1308,7 +1312,7 @@ Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, Tcl_Size *pobjc)
1308
1312
static PyObject *
1309
1313
Tkapp_UnicodeResult (TkappObject * self )
1310
1314
{
1311
- return unicodeFromTclObj (Tcl_GetObjResult (self -> interp ));
1315
+ return unicodeFromTclObj (self , Tcl_GetObjResult (self -> interp ));
1312
1316
}
1313
1317
1314
1318
@@ -1327,7 +1331,7 @@ Tkapp_ObjectResult(TkappObject *self)
1327
1331
res = FromObj (self , value );
1328
1332
Tcl_DecrRefCount (value );
1329
1333
} else {
1330
- res = unicodeFromTclObj (value );
1334
+ res = unicodeFromTclObj (self , value );
1331
1335
}
1332
1336
return res ;
1333
1337
}
@@ -1860,7 +1864,7 @@ GetVar(TkappObject *self, PyObject *args, int flags)
1860
1864
res = FromObj (self , tres );
1861
1865
}
1862
1866
else {
1863
- res = unicodeFromTclObj (tres );
1867
+ res = unicodeFromTclObj (self , tres );
1864
1868
}
1865
1869
}
1866
1870
LEAVE_OVERLAP_TCL
@@ -2307,7 +2311,7 @@ PythonCmd(ClientData clientData, Tcl_Interp *interp,
2307
2311
2308
2312
for (i = 0 ; i < (objc - 1 ); i ++ ) {
2309
2313
PyObject * s = objargs ? FromObj (data -> self , objv [i + 1 ])
2310
- : unicodeFromTclObj (objv [i + 1 ]);
2314
+ : unicodeFromTclObj (data -> self , objv [i + 1 ]);
2311
2315
if (!s ) {
2312
2316
Py_DECREF (args );
2313
2317
return PythonCmd_Error (interp );
0 commit comments