@@ -497,24 +497,28 @@ unicodeFromTclString(const char *s)
497
497
}
498
498
499
499
static PyObject *
500
- unicodeFromTclObj (Tcl_Obj * value )
500
+ unicodeFromTclObj (TkappObject * tkapp , Tcl_Obj * value )
501
501
{
502
502
Tcl_Size len ;
503
503
#if USE_TCL_UNICODE
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
- #else
504
+ if (value -> typePtr != NULL && tkapp != NULL &&
505
+ (value -> typePtr == tkapp -> StringType ||
506
+ value -> typePtr == tkapp -> UTF32StringType ))
507
+ {
508
+ int byteorder = NATIVE_BYTEORDER ;
509
+ const Tcl_UniChar * u = Tcl_GetUnicodeFromObj (value , & len );
510
+ if (sizeof (Tcl_UniChar ) == 2 )
511
+ return PyUnicode_DecodeUTF16 ((const char * )u , len * 2 ,
512
+ "surrogatepass" , & byteorder );
513
+ else if (sizeof (Tcl_UniChar ) == 4 )
514
+ return PyUnicode_DecodeUTF32 ((const char * )u , len * 4 ,
515
+ "surrogatepass" , & byteorder );
516
+ else
517
+ Py_UNREACHABLE ();
518
+ }
519
+ #endif
515
520
const char * s = Tcl_GetStringFromObj (value , & len );
516
521
return unicodeFromTclStringAndSize (s , len );
517
- #endif
518
522
}
519
523
520
524
/*[clinic input]
@@ -796,7 +800,7 @@ static PyObject *
796
800
PyTclObject_string (PyTclObject * self , void * ignored )
797
801
{
798
802
if (!self -> string ) {
799
- self -> string = unicodeFromTclObj (self -> value );
803
+ self -> string = unicodeFromTclObj (NULL , self -> value );
800
804
if (!self -> string )
801
805
return NULL ;
802
806
}
@@ -810,7 +814,7 @@ PyTclObject_str(PyTclObject *self)
810
814
return Py_NewRef (self -> string );
811
815
}
812
816
/* XXX Could cache result if it is non-ASCII. */
813
- return unicodeFromTclObj (self -> value );
817
+ return unicodeFromTclObj (NULL , self -> value );
814
818
}
815
819
816
820
static PyObject *
@@ -1149,7 +1153,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value)
1149
1153
Tcl_Interp * interp = Tkapp_Interp (tkapp );
1150
1154
1151
1155
if (value -> typePtr == NULL ) {
1152
- return unicodeFromTclObj (value );
1156
+ return unicodeFromTclObj (tkapp , value );
1153
1157
}
1154
1158
1155
1159
if (value -> typePtr == tkapp -> BooleanType ||
@@ -1214,7 +1218,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value)
1214
1218
if (value -> typePtr == tkapp -> StringType ||
1215
1219
value -> typePtr == tkapp -> UTF32StringType )
1216
1220
{
1217
- return unicodeFromTclObj (value );
1221
+ return unicodeFromTclObj (tkapp , value );
1218
1222
}
1219
1223
1220
1224
if (tkapp -> BignumType == NULL &&
@@ -1314,7 +1318,7 @@ Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, Tcl_Size *pobjc)
1314
1318
static PyObject *
1315
1319
Tkapp_UnicodeResult (TkappObject * self )
1316
1320
{
1317
- return unicodeFromTclObj (Tcl_GetObjResult (self -> interp ));
1321
+ return unicodeFromTclObj (self , Tcl_GetObjResult (self -> interp ));
1318
1322
}
1319
1323
1320
1324
@@ -1333,7 +1337,7 @@ Tkapp_ObjectResult(TkappObject *self)
1333
1337
res = FromObj (self , value );
1334
1338
Tcl_DecrRefCount (value );
1335
1339
} else {
1336
- res = unicodeFromTclObj (value );
1340
+ res = unicodeFromTclObj (self , value );
1337
1341
}
1338
1342
return res ;
1339
1343
}
@@ -1863,7 +1867,7 @@ GetVar(TkappObject *self, PyObject *args, int flags)
1863
1867
res = FromObj (self , tres );
1864
1868
}
1865
1869
else {
1866
- res = unicodeFromTclObj (tres );
1870
+ res = unicodeFromTclObj (self , tres );
1867
1871
}
1868
1872
}
1869
1873
LEAVE_OVERLAP_TCL
@@ -2308,7 +2312,7 @@ PythonCmd(ClientData clientData, Tcl_Interp *interp,
2308
2312
return PythonCmd_Error (interp );
2309
2313
2310
2314
for (i = 0 ; i < (objc - 1 ); i ++ ) {
2311
- PyObject * s = unicodeFromTclObj (objv [i + 1 ]);
2315
+ PyObject * s = unicodeFromTclObj (( TkappObject * ) data -> self , objv [i + 1 ]);
2312
2316
if (!s ) {
2313
2317
Py_DECREF (args );
2314
2318
return PythonCmd_Error (interp );
0 commit comments