@@ -148,6 +148,18 @@ private TruffleString(Object data, int offset, int length, int stride, Encoding
148
148
super (data , offset , length , stride , encoding , isCacheHead ? FLAG_CACHE_HEAD : 0 , codePointLength , codeRange , hashCode );
149
149
}
150
150
151
+ private TruffleString (Object data , int offset , int length , int stride , Encoding encoding , int codePointLength , int codeRange , int hashCode , boolean isCacheHead , TruffleString cacheEntry ) {
152
+ this (data , offset , length , stride , encoding , codePointLength , codeRange , hashCode , isCacheHead );
153
+ if (cacheEntry != null ) {
154
+ assert !cacheEntry .isCacheHead ();
155
+ assert isCacheHead ();
156
+ assert next == null ;
157
+ TruffleString cacheHead = this ;
158
+ cacheEntry .next = cacheHead ;
159
+ cacheHead .next = cacheEntry ;
160
+ }
161
+ }
162
+
151
163
private static TruffleString create (Object data , int offset , int length , int stride , Encoding encoding , int codePointLength , int codeRange , int hashCode , boolean isCacheHead ) {
152
164
TruffleString string = new TruffleString (data , offset , length , stride , encoding , codePointLength , codeRange , hashCode , isCacheHead );
153
165
if (AbstractTruffleString .DEBUG_ALWAYS_CREATE_JAVA_STRING ) {
@@ -156,6 +168,14 @@ private static TruffleString create(Object data, int offset, int length, int str
156
168
return string ;
157
169
}
158
170
171
+ private static TruffleString createWithCacheEntry (Object data , int offset , int length , int stride , Encoding encoding , int codePointLength , int codeRange , int hashCode , TruffleString cacheEntry ) {
172
+ TruffleString string = new TruffleString (data , offset , length , stride , encoding , codePointLength , codeRange , hashCode , true , cacheEntry );
173
+ if (AbstractTruffleString .DEBUG_ALWAYS_CREATE_JAVA_STRING ) {
174
+ string .toJavaStringUncached ();
175
+ }
176
+ return string ;
177
+ }
178
+
159
179
static TruffleString createFromByteArray (byte [] bytes , int length , int stride , Encoding encoding , int codePointLength , int codeRange ) {
160
180
return createFromByteArray (bytes , 0 , length , stride , encoding , codePointLength , codeRange , true );
161
181
}
@@ -196,6 +216,14 @@ static TruffleString createFromArray(Object bytes, int offset, int length, int s
196
216
return TruffleString .create (bytes , offset , length , stride , encoding , codePointLength , codeRange , hashCode , isCacheHead );
197
217
}
198
218
219
+ static TruffleString createFromByteArrayWithCacheEntry (byte [] bytes , int offset , int length , int stride , Encoding encoding , int codePointLength , int codeRange , int hashCode ,
220
+ TruffleString cacheEntry ) {
221
+ assert offset >= 0 ;
222
+ assert offset + ((long ) length << stride ) <= bytes .length ;
223
+ assert attrsAreCorrect (bytes , encoding , offset , length , codePointLength , codeRange , stride );
224
+ return TruffleString .createWithCacheEntry (bytes , offset , length , stride , encoding , codePointLength , codeRange , hashCode , cacheEntry );
225
+ }
226
+
199
227
static TruffleString createConstant (byte [] bytes , int length , int stride , Encoding encoding , int codePointLength , int codeRange ) {
200
228
return createConstant (bytes , length , stride , encoding , codePointLength , codeRange , true );
201
229
}
@@ -298,20 +326,6 @@ void cacheInsert(TruffleString entry) {
298
326
} while (!setNextAtomic (cacheHead , cacheHeadNext , entry ));
299
327
}
300
328
301
- /*
302
- * Simpler and faster insertion for the case `this` and `entry` were just allocated together and
303
- * before they are published. The CAS is not needed in that case since we know nobody could
304
- * write to `next` fields before us.
305
- */
306
- void cacheInsertFirstBeforePublished (TruffleString entry ) {
307
- assert !entry .isCacheHead ();
308
- assert isCacheHead ();
309
- assert next == null ;
310
- TruffleString cacheHead = this ;
311
- entry .next = cacheHead ;
312
- cacheHead .next = entry ;
313
- }
314
-
315
329
private static boolean hasDuplicateEncoding (TruffleString cacheHead , TruffleString start , TruffleString insertEntry ) {
316
330
if (start == null ) {
317
331
return false ;
0 commit comments