Skip to content

Commit 012da85

Browse files
committed
[GR-68826] TruffleString: remove Java String caching.
PullRequest: graal/21883
2 parents 3d8c073 + 4984822 commit 012da85

File tree

3 files changed

+17
-94
lines changed

3 files changed

+17
-94
lines changed

truffle/src/com.oracle.truffle.api.strings/src/com/oracle/truffle/api/strings/AbstractTruffleString.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ public abstract sealed class AbstractTruffleString permits TruffleString, Mutabl
8686
* <li>{@link LazyLong}</li>
8787
* <li>{@link LazyConcat}</li>
8888
* <li>{@link NativePointer}</li>
89-
* <li>{@link String} (only for caching results of {@link #toJavaStringUncached()})</li>
9089
* </ul>
9190
*/
9291
private Object data;
@@ -155,8 +154,6 @@ static boolean isByte(int i) {
155154
private static void validateData(Object data, int offset, int length, int stride) {
156155
if (data instanceof byte[]) {
157156
TStringOps.validateRegion((byte[]) data, offset, length, stride);
158-
} else if (data instanceof String) {
159-
TStringOps.validateRegion(TStringUnsafe.getJavaStringArray((String) data), offset, length, stride);
160157
} else if (data instanceof LazyLong || data instanceof LazyConcat) {
161158
validateDataLazy(offset, length, stride);
162159
} else if (data instanceof NativePointer) {
@@ -418,10 +415,6 @@ final boolean isLazyLong() {
418415
return data instanceof AbstractTruffleString.LazyLong;
419416
}
420417

421-
final boolean isJavaString() {
422-
return data instanceof String;
423-
}
424-
425418
static TruffleStringIterator forwardIterator(AbstractTruffleString a, byte[] arrayA, long offsetA, int codeRangeA, Encoding encoding) {
426419
return forwardIterator(a, arrayA, offsetA, codeRangeA, encoding, TruffleString.ErrorHandling.BEST_EFFORT);
427420
}
@@ -1359,7 +1352,7 @@ public final String toString() {
13591352
public final String toStringDebug() {
13601353
Object curData = data;
13611354
String dataString;
1362-
if (curData instanceof byte[] || curData instanceof NativePointer || curData instanceof String) {
1355+
if (curData instanceof byte[] || curData instanceof NativePointer) {
13631356
dataString = String.format("\"%s\"", toJavaStringUncached());
13641357
} else if (curData instanceof LazyLong lazyLong) {
13651358
dataString = String.format("LazyLong(%d)", lazyLong.value);

truffle/src/com.oracle.truffle.api.strings/src/com/oracle/truffle/api/strings/TStringInternalNodes.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,15 +2009,7 @@ static TruffleString doNonEmpty(Node node, String javaString, int charOffset, in
20092009
TStringOps.arraycopyWithStride(node, arrayJS, offsetJS + byteArrayBaseOffset(), 0, 0, array, offset + byteArrayBaseOffset(), 0, 0, length << stride);
20102010
}
20112011
}
2012-
int hash = TStringUnsafe.getJavaStringHashMasked(javaString);
2013-
final TruffleString cacheEntry;
2014-
if (length == javaString.length()) {
2015-
assert charOffset == 0;
2016-
cacheEntry = TruffleString.createWrapJavaString(javaString, codePointLength, codeRange);
2017-
} else {
2018-
cacheEntry = null;
2019-
}
2020-
return TruffleString.createFromByteArrayWithCacheEntry(array, offset, length, stride, Encoding.UTF_16, codePointLength, codeRange, hash, cacheEntry);
2012+
return TruffleString.createFromByteArray(array, offset, length, stride, Encoding.UTF_16, codePointLength, codeRange, TStringUnsafe.getJavaStringHashMasked(javaString), true);
20212013
}
20222014
}
20232015

truffle/src/com.oracle.truffle.api.strings/src/com/oracle/truffle/api/strings/TruffleString.java

Lines changed: 15 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -148,18 +148,6 @@ private TruffleString(Object data, int offset, int length, int stride, Encoding
148148
super(data, offset, length, stride, encoding, isCacheHead ? FLAG_CACHE_HEAD : 0, codePointLength, codeRange, hashCode);
149149
}
150150

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-
163151
private static TruffleString create(Object data, int offset, int length, int stride, Encoding encoding, int codePointLength, int codeRange, int hashCode, boolean isCacheHead) {
164152
TruffleString string = new TruffleString(data, offset, length, stride, encoding, codePointLength, codeRange, hashCode, isCacheHead);
165153
if (AbstractTruffleString.DEBUG_ALWAYS_CREATE_JAVA_STRING) {
@@ -168,14 +156,6 @@ private static TruffleString create(Object data, int offset, int length, int str
168156
return string;
169157
}
170158

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-
179159
static TruffleString createFromByteArray(byte[] bytes, int length, int stride, Encoding encoding, int codePointLength, int codeRange) {
180160
return createFromByteArray(bytes, 0, length, stride, encoding, codePointLength, codeRange, true);
181161
}
@@ -216,14 +196,6 @@ static TruffleString createFromArray(Object bytes, int offset, int length, int s
216196
return TruffleString.create(bytes, offset, length, stride, encoding, codePointLength, codeRange, hashCode, isCacheHead);
217197
}
218198

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-
227199
static TruffleString createConstant(byte[] bytes, int length, int stride, Encoding encoding, int codePointLength, int codeRange) {
228200
return createConstant(bytes, length, stride, encoding, codePointLength, codeRange, true);
229201
}
@@ -250,12 +222,6 @@ static TruffleString createLazyConcat(TruffleString a, TruffleString b, Encoding
250222
return TruffleString.create(new LazyConcat(a, b), 0, length, stride, encoding, a.codePointLength() + b.codePointLength(), codeRange, 0, true);
251223
}
252224

253-
static TruffleString createWrapJavaString(String str, int codePointLength, int codeRange) {
254-
int stride = TStringUnsafe.getJavaStringStride(str);
255-
int hash = TStringUnsafe.getJavaStringHashMasked(str);
256-
return TruffleString.create(str, 0, str.length(), stride, Encoding.UTF_16, codePointLength, codeRange, hash, false);
257-
}
258-
259225
private static boolean attrsAreCorrect(Object dataA, Encoding encoding, int offset, int length, int codePointLength, int codeRange, int stride) {
260226
CompilerAsserts.neverPartOfCompilation();
261227
int knownCodeRange = TSCodeRange.getUnknownCodeRangeForEncoding(encoding.id);
@@ -341,7 +307,7 @@ private static boolean hasDuplicateEncoding(TruffleString cacheHead, TruffleStri
341307
}
342308

343309
private static boolean cacheEntryEquals(TruffleString a, TruffleString b) {
344-
return b.encoding() == a.encoding() && a.isNative() == b.isNative() && a.stride() == b.stride() && (!isUTF16(a.encoding()) || b.isJavaString() == a.isJavaString());
310+
return b.encoding() == a.encoding() && a.isNative() == b.isNative() && a.stride() == b.stride();
345311
}
346312

347313
@TruffleBoundary
@@ -353,7 +319,6 @@ private boolean cacheRingIsValid() {
353319
CompilerAsserts.neverPartOfCompilation();
354320
TruffleString head = null;
355321
TruffleString cur = this;
356-
boolean javaStringVisited = false;
357322
BitSet visitedManaged = new BitSet(Encoding.values().length);
358323
BitSet visitedNativeRegular = new BitSet(Encoding.values().length);
359324
BitSet visitedNativeCompact = new BitSet(Encoding.values().length);
@@ -363,22 +328,17 @@ private boolean cacheRingIsValid() {
363328
assert head == null : "multiple cache heads";
364329
head = cur;
365330
}
366-
if (cur.isJavaString()) {
367-
assert !javaStringVisited : "duplicate cached java string";
368-
javaStringVisited = true;
331+
Encoding encoding = Encoding.get(cur.encoding());
332+
if (cur.isManaged()) {
333+
assert !visitedManaged.get(cur.encoding()) : "duplicate managed " + encoding;
334+
visitedManaged.set(cur.encoding());
369335
} else {
370-
Encoding encoding = Encoding.get(cur.encoding());
371-
if (cur.isManaged()) {
372-
assert !visitedManaged.get(cur.encoding()) : "duplicate managed " + encoding;
373-
visitedManaged.set(cur.encoding());
336+
if (cur.stride() == encoding.naturalStride) {
337+
assert !visitedNativeRegular.get(cur.encoding()) : "duplicate native " + encoding;
338+
visitedNativeRegular.set(cur.encoding());
374339
} else {
375-
if (cur.stride() == encoding.naturalStride) {
376-
assert !visitedNativeRegular.get(cur.encoding()) : "duplicate native " + encoding;
377-
visitedNativeRegular.set(cur.encoding());
378-
} else {
379-
assert !visitedNativeCompact.get(cur.encoding()) : "duplicate compact native " + encoding;
380-
visitedNativeCompact.set(cur.encoding());
381-
}
340+
assert !visitedNativeCompact.get(cur.encoding()) : "duplicate compact native " + encoding;
341+
visitedNativeCompact.set(cur.encoding());
382342
}
383343
}
384344
assert visited.add(cur) : "not a ring structure";
@@ -2540,13 +2500,12 @@ TruffleString nativeImmutable(TruffleString a, Encoding encoding, boolean cacheR
25402500
CompilerAsserts.partialEvaluationConstant(cacheResult);
25412501
a.checkEncoding(encoding);
25422502
TruffleString cur = a.next;
2543-
assert !a.isJavaString();
25442503
if (cacheResult && cur != null) {
2545-
while (cur != a && (cur.isNative() || cur.isJavaString() || !cur.isCompatibleToIntl(encoding))) {
2504+
while (cur != a && (cur.isNative() || !cur.isCompatibleToIntl(encoding))) {
25462505
cur = cur.next;
25472506
}
25482507
if (cacheHit.profile(this, cur != a)) {
2549-
assert cur.isCompatibleToIntl(encoding) && cur.isManaged() && !cur.isJavaString();
2508+
assert cur.isCompatibleToIntl(encoding) && cur.isManaged();
25502509
return cur;
25512510
}
25522511
}
@@ -6940,7 +6899,6 @@ public abstract static class ToJavaStringNode extends AbstractPublicNode {
69406899
@Specialization
69416900
static String doUTF16(TruffleString a,
69426901
@Bind Node node,
6943-
@Cached InlinedConditionProfile cacheHit,
69446902
@Cached @Exclusive InlinedConditionProfile managedProfileA,
69456903
@Cached @Exclusive InlinedConditionProfile nativeProfileA,
69466904
@Cached @Shared TStringInternalNodes.GetCodePointLengthNode getCodePointLengthNode,
@@ -6952,26 +6910,13 @@ static String doUTF16(TruffleString a,
69526910
return "";
69536911
}
69546912
TruffleString cur = a.next;
6955-
if (cur != null) {
6956-
while (cur != a && !cur.isJavaString()) {
6957-
cur = cur.next;
6958-
}
6959-
if (cacheHit.profile(node, cur.isJavaString())) {
6960-
return (String) cur.data();
6961-
}
6962-
}
6963-
cur = a.next;
69646913
if (cur != null) {
69656914
while (cur != a && !cur.isCompatibleToIntl(Encoding.UTF_16)) {
69666915
cur = cur.next;
69676916
}
69686917
} else {
69696918
cur = a;
69706919
}
6971-
if (cur.isJavaString()) {
6972-
// java string was inserted in parallel
6973-
return (String) cur.data();
6974-
}
69756920
Encoding encodingA = Encoding.get(cur.encoding());
69766921
final AbstractTruffleString utf16String;
69776922
final byte[] utf16Array;
@@ -7009,9 +6954,7 @@ static String doUTF16(TruffleString a,
70096954
assert transCoded.isManaged();
70106955
utf16Offset = byteArrayBaseOffset() + transCoded.offset();
70116956
}
7012-
String javaString = createJavaStringNode.execute(node, utf16String, utf16Array, utf16Offset);
7013-
a.cacheInsert(TruffleString.createWrapJavaString(javaString, utf16String.codePointLength(), utf16String.codeRange()));
7014-
return javaString;
6957+
return createJavaStringNode.execute(node, utf16String, utf16Array, utf16Offset);
70156958
} finally {
70166959
Reference.reachabilityFence(dataCur);
70176960
}
@@ -7173,13 +7116,12 @@ static TruffleString asNative(TruffleString a, NativeAllocator allocator, Encodi
71737116
return a;
71747117
}
71757118
TruffleString cur = a.next;
7176-
assert !a.isJavaString();
71777119
if (cacheResult && cur != null) {
71787120
while (cur != a && (!cur.isNative() || !cur.isCompatibleToIntl(encoding) || cur.stride() != (useCompaction ? strideA : encoding.naturalStride))) {
71797121
cur = cur.next;
71807122
}
71817123
if (cacheHit.profile(node, cur != a)) {
7182-
assert cur.isCompatibleToIntl(encoding) && cur.isNative() && !cur.isJavaString() && cur.stride() == (useCompaction ? strideA : encoding.naturalStride);
7124+
assert cur.isCompatibleToIntl(encoding) && cur.isNative() && cur.stride() == (useCompaction ? strideA : encoding.naturalStride);
71837125
return cur;
71847126
}
71857127
}
@@ -7426,20 +7368,17 @@ static TruffleString immutable(Node node, TruffleString a, Encoding targetEncodi
74267368
}
74277369
final boolean mustCompact = a.stride() > targetEncoding.naturalStride;
74287370
if (noOpProfile.profile(node, isCompatible && !mustCompact)) {
7429-
assert !a.isJavaString();
74307371
return a;
74317372
}
74327373
if (a.isEmpty()) {
74337374
return targetEncoding.getEmpty();
74347375
}
74357376
TruffleString cur = a.next;
7436-
assert !a.isJavaString();
74377377
if (cur != null) {
7438-
while (cur != a && cur.encoding() != targetEncoding.id || (isUTF16(targetEncoding) && cur.isJavaString())) {
7378+
while (cur != a && cur.encoding() != targetEncoding.id) {
74397379
cur = cur.next;
74407380
}
74417381
if (cacheHit.profile(node, cur.encoding() == targetEncoding.id)) {
7442-
assert !cur.isJavaString();
74437382
return cur;
74447383
}
74457384
}
@@ -7567,7 +7506,6 @@ public abstract static class ForceEncodingNode extends AbstractPublicNode {
75677506

75687507
@Specialization(guards = "isCompatibleAndNotCompacted(a, expectedEncoding, targetEncoding)")
75697508
static TruffleString compatibleImmutable(TruffleString a, @SuppressWarnings("unused") Encoding expectedEncoding, @SuppressWarnings("unused") Encoding targetEncoding) {
7570-
assert !a.isJavaString();
75717509
return a;
75727510
}
75737511

0 commit comments

Comments
 (0)