9393import com .oracle .graal .python .builtins .objects .ints .PInt ;
9494import com .oracle .graal .python .builtins .objects .set .PBaseSet ;
9595import com .oracle .graal .python .builtins .objects .str .PString ;
96- import com .oracle .graal .python .builtins .objects .str .StringNodes ;
9796import com .oracle .graal .python .builtins .objects .str .StringNodes .IsInternedStringNode ;
9897import com .oracle .graal .python .builtins .objects .type .TypeNodes .IsSameTypeNode ;
9998import com .oracle .graal .python .compiler .BytecodeCodeUnit ;
112111import com .oracle .graal .python .lib .PyUnicodeCheckExactNode ;
113112import com .oracle .graal .python .nodes .ErrorMessages ;
114113import com .oracle .graal .python .nodes .PRaiseNode ;
114+ import com .oracle .graal .python .nodes .StringLiterals ;
115115import com .oracle .graal .python .nodes .bytecode_dsl .BytecodeDSLCodeUnit ;
116116import com .oracle .graal .python .nodes .bytecode_dsl .PBytecodeDSLRootNode ;
117117import com .oracle .graal .python .nodes .bytecode_dsl .PBytecodeDSLRootNodeGen ;
@@ -817,16 +817,17 @@ private void writeComplexObject(Object v, int flag) {
817817 } else if (isJavaString (v )) {
818818 writeByte (TYPE_UNICODE | flag );
819819 writeString (TruffleString .fromJavaStringUncached ((String ) v , TS_ENCODING ));
820- } else if (v instanceof TruffleString ) {
821- writeByte (TYPE_UNICODE | flag );
822- writeString ((TruffleString ) v );
823820 } else if (PyUnicodeCheckExactNode .executeUncached (v )) {
824- if (version >= 3 && IsInternedStringNode .executeUncached (( PString ) v )) {
821+ if (version >= 3 && IsInternedStringNode .executeUncached (v )) {
825822 writeByte (TYPE_INTERNED | flag );
826823 } else {
827824 writeByte (TYPE_UNICODE | flag );
828825 }
829- writeString (((PString ) v ).getValueUncached ());
826+ if (v instanceof PString pstring ) {
827+ writeString (pstring .getValueUncached ());
828+ } else {
829+ writeString ((TruffleString ) v );
830+ }
830831 } else if (PyTupleCheckExactNode .executeUncached (v )) {
831832 Object [] items = GetObjectArrayNode .executeUncached (v );
832833 if (version >= 4 && items .length < 256 ) {
@@ -1082,9 +1083,9 @@ private Object readObject(int type, AddRefAndReturn addRef) throws NumberFormatE
10821083 case TYPE_SHORT_ASCII :
10831084 return addRef .run (readAscii (readByteSize (), false ));
10841085 case TYPE_INTERNED :
1085- return addRef .run (StringNodes . InternStringNode . executeUncached ( readString () ));
1086+ return addRef .run (readString (true ));
10861087 case TYPE_UNICODE :
1087- return addRef .run (readString ());
1088+ return addRef .run (readString (false ));
10881089 case TYPE_SMALL_TUPLE :
10891090 int smallTupleSize = readByteSize ();
10901091 Object [] smallTupleItems = new Object [smallTupleSize ];
@@ -1162,9 +1163,18 @@ private void writeString(TruffleString v) {
11621163 writeBytes (ba .getArray (), ba .getOffset (), ba .getLength ());
11631164 }
11641165
1165- private TruffleString readString () {
1166+ private TruffleString readString (boolean intern ) {
11661167 int sz = readInt ();
1167- return TruffleString .fromByteArrayUncached (readNBytes (sz ), 0 , sz , Encoding .UTF_8 , true ).switchEncodingUncached (TS_ENCODING , TranscodingErrorHandler .DEFAULT_KEEP_SURROGATES_IN_UTF8 );
1168+ if (sz == 0 ) {
1169+ return StringLiterals .T_EMPTY_STRING ;
1170+ }
1171+ var utf8String = TruffleString .fromByteArrayUncached (readNBytes (sz ), 0 , sz , Encoding .UTF_8 , true );
1172+ var value = utf8String .switchEncodingUncached (TS_ENCODING , TranscodingErrorHandler .DEFAULT_KEEP_SURROGATES_IN_UTF8 );
1173+ if (intern ) {
1174+ return PythonUtils .internString (value );
1175+ } else {
1176+ return value ;
1177+ }
11681178 }
11691179
11701180 private void writeShortString (String v ) throws IOException {
@@ -1174,6 +1184,7 @@ private void writeShortString(String v) throws IOException {
11741184 out .write (bytes );
11751185 }
11761186
1187+ // Only used by readDoubleString() so no interning
11771188 private TruffleString readShortString () {
11781189 int sz = readByteSize ();
11791190 byte [] bytes = readNBytes (sz );
@@ -1184,7 +1195,7 @@ private Object readAscii(long sz, boolean intern) {
11841195 byte [] bytes = readNBytes ((int ) sz );
11851196 TruffleString value = TruffleString .fromByteArrayUncached (bytes , 0 , (int ) sz , Encoding .US_ASCII , true ).switchEncodingUncached (TS_ENCODING );
11861197 if (intern ) {
1187- return StringNodes . InternStringNode . executeUncached (value );
1198+ return PythonUtils . internString (value );
11881199 } else {
11891200 return value ;
11901201 }
@@ -1216,7 +1227,7 @@ private Object readJavaArray() {
12161227 case ARRAY_TYPE_BOOLEAN :
12171228 return readBooleanArray ();
12181229 case ARRAY_TYPE_STRING :
1219- return readStringArray ();
1230+ return readStringArray (false );
12201231 case ARRAY_TYPE_OBJECT :
12211232 return readObjectArray ();
12221233 default :
@@ -1284,14 +1295,14 @@ private boolean[] readBooleanArray() {
12841295 return a ;
12851296 }
12861297
1287- private TruffleString [] readStringArray () {
1298+ private TruffleString [] readStringArray (boolean intern ) {
12881299 int length = readInt ();
12891300 if (length == 0 ) {
12901301 return EMPTY_TRUFFLESTRING_ARRAY ;
12911302 }
12921303 TruffleString [] a = new TruffleString [length ];
12931304 for (int i = 0 ; i < length ; i ++) {
1294- a [i ] = readString ();
1305+ a [i ] = readString (intern );
12951306 }
12961307 return a ;
12971308 }
@@ -1346,19 +1357,19 @@ private BytecodeCodeUnit readBytecodeCodeUnit() {
13461357 if (fileVersion != Compiler .BYTECODE_VERSION ) {
13471358 throw new MarshalError (ValueError , ErrorMessages .BYTECODE_VERSION_MISMATCH , Compiler .BYTECODE_VERSION , fileVersion );
13481359 }
1349- TruffleString name = readString ();
1350- TruffleString qualname = readString ();
1360+ TruffleString name = readString (true );
1361+ TruffleString qualname = readString (true );
13511362 int argCount = readInt ();
13521363 int kwOnlyArgCount = readInt ();
13531364 int positionalOnlyArgCount = readInt ();
13541365 int stacksize = readInt ();
13551366 byte [] code = readBytes ();
13561367 byte [] srcOffsetTable = readBytes ();
13571368 int flags = readInt ();
1358- TruffleString [] names = readStringArray ();
1359- TruffleString [] varnames = readStringArray ();
1360- TruffleString [] cellvars = readStringArray ();
1361- TruffleString [] freevars = readStringArray ();
1369+ TruffleString [] names = readStringArray (true );
1370+ TruffleString [] varnames = readStringArray (true );
1371+ TruffleString [] cellvars = readStringArray (true );
1372+ TruffleString [] freevars = readStringArray (true );
13621373 int [] cell2arg = readIntArray ();
13631374 if (cell2arg .length == 0 ) {
13641375 cell2arg = null ;
@@ -1391,16 +1402,16 @@ private BytecodeDSLCodeUnit readBytecodeDSLCodeUnit() {
13911402 }
13921403
13931404 byte [] serialized = readBytes ();
1394- TruffleString name = readString ();
1395- TruffleString qualname = readString ();
1405+ TruffleString name = readString (true );
1406+ TruffleString qualname = readString (true );
13961407 int argCount = readInt ();
13971408 int kwOnlyArgCount = readInt ();
13981409 int positionalOnlyArgCount = readInt ();
13991410 int flags = readInt ();
1400- TruffleString [] names = readStringArray ();
1401- TruffleString [] varnames = readStringArray ();
1402- TruffleString [] cellvars = readStringArray ();
1403- TruffleString [] freevars = readStringArray ();
1411+ TruffleString [] names = readStringArray (true );
1412+ TruffleString [] varnames = readStringArray (true );
1413+ TruffleString [] cellvars = readStringArray (true );
1414+ TruffleString [] freevars = readStringArray (true );
14041415 int [] cell2arg = readIntArray ();
14051416 if (cell2arg .length == 0 ) {
14061417 cell2arg = null ;
@@ -1492,7 +1503,7 @@ private void writeBytecodeDSLCodeUnit(BytecodeDSLCodeUnit code) throws IOExcepti
14921503 }
14931504
14941505 private PCode readCode () {
1495- TruffleString fileName = readString ();
1506+ TruffleString fileName = readString (true );
14961507 int flags = readInt ();
14971508
14981509 int codeLen = readSize ();
0 commit comments