@@ -144,35 +144,43 @@ private static VarHandle initializeNextUpdater() {
144
144
private static final byte FLAG_CACHE_HEAD = (byte ) 0x80 ;
145
145
TruffleString next ;
146
146
147
- private TruffleString (Object data , int offset , int length , int stride , Encoding encoding , int codePointLength , int codeRange , boolean isCacheHead ) {
148
- super (data , offset , length , stride , encoding , isCacheHead ? FLAG_CACHE_HEAD : 0 , codePointLength , codeRange );
147
+ private TruffleString (Object data , int offset , int length , int stride , Encoding encoding , int codePointLength , int codeRange , int hashCode , boolean isCacheHead ) {
148
+ super (data , offset , length , stride , encoding , isCacheHead ? FLAG_CACHE_HEAD : 0 , codePointLength , codeRange , hashCode );
149
149
}
150
150
151
- private static TruffleString create (Object data , int offset , int length , int stride , Encoding encoding , int codePointLength , int codeRange , boolean isCacheHead ) {
152
- TruffleString string = new TruffleString (data , offset , length , stride , encoding , codePointLength , codeRange , isCacheHead );
151
+ private static TruffleString create (Object data , int offset , int length , int stride , Encoding encoding , int codePointLength , int codeRange , int hashCode , boolean isCacheHead ) {
152
+ TruffleString string = new TruffleString (data , offset , length , stride , encoding , codePointLength , codeRange , hashCode , isCacheHead );
153
153
if (AbstractTruffleString .DEBUG_ALWAYS_CREATE_JAVA_STRING ) {
154
154
string .toJavaStringUncached ();
155
155
}
156
156
return string ;
157
157
}
158
158
159
159
static TruffleString createFromByteArray (byte [] bytes , int length , int stride , Encoding encoding , int codePointLength , int codeRange ) {
160
- return createFromByteArray (bytes , length , stride , encoding , codePointLength , codeRange , true );
160
+ return createFromByteArray (bytes , 0 , length , stride , encoding , codePointLength , codeRange , true );
161
161
}
162
162
163
163
static TruffleString createFromByteArray (byte [] bytes , int length , int stride , Encoding encoding , int codePointLength , int codeRange , boolean isCacheHead ) {
164
- return createFromArray (bytes , 0 , length , stride , encoding , codePointLength , codeRange , isCacheHead );
164
+ return createFromByteArray (bytes , 0 , length , stride , encoding , codePointLength , codeRange , 0 , isCacheHead );
165
165
}
166
166
167
167
static TruffleString createFromByteArray (byte [] bytes , int offset , int length , int stride , Encoding encoding , int codePointLength , int codeRange , boolean isCacheHead ) {
168
- return createFromArray (bytes , offset , length , stride , encoding , codePointLength , codeRange , isCacheHead );
168
+ return createFromByteArray (bytes , offset , length , stride , encoding , codePointLength , codeRange , 0 , isCacheHead );
169
+ }
170
+
171
+ static TruffleString createFromByteArray (byte [] bytes , int offset , int length , int stride , Encoding encoding , int codePointLength , int codeRange , int hashCode , boolean isCacheHead ) {
172
+ return createFromArray (bytes , offset , length , stride , encoding , codePointLength , codeRange , hashCode , isCacheHead );
169
173
}
170
174
171
175
static TruffleString createFromArray (Object bytes , int offset , int length , int stride , Encoding encoding , int codePointLength , int codeRange ) {
172
176
return createFromArray (bytes , offset , length , stride , encoding , codePointLength , codeRange , true );
173
177
}
174
178
175
179
static TruffleString createFromArray (Object bytes , int offset , int length , int stride , Encoding encoding , int codePointLength , int codeRange , boolean isCacheHead ) {
180
+ return createFromArray (bytes , offset , length , stride , encoding , codePointLength , codeRange , 0 , isCacheHead );
181
+ }
182
+
183
+ static TruffleString createFromArray (Object bytes , int offset , int length , int stride , Encoding encoding , int codePointLength , int codeRange , int hashCode , boolean isCacheHead ) {
176
184
assert bytes instanceof byte [] || isInlinedJavaString (bytes ) || bytes instanceof NativePointer ;
177
185
assert offset >= 0 ;
178
186
assert bytes instanceof NativePointer || offset + ((long ) length << stride ) <= ((byte []) bytes ).length ;
@@ -183,9 +191,9 @@ static TruffleString createFromArray(Object bytes, int offset, int length, int s
183
191
int add = byteLength ;
184
192
byte [] copy = new byte [add + byteLength ];
185
193
System .arraycopy (bytes , offset , copy , add , byteLength );
186
- return TruffleString .create (copy , add , length , stride , encoding , codePointLength , codeRange , isCacheHead );
194
+ return TruffleString .create (copy , add , length , stride , encoding , codePointLength , codeRange , hashCode , isCacheHead );
187
195
}
188
- return TruffleString .create (bytes , offset , length , stride , encoding , codePointLength , codeRange , isCacheHead );
196
+ return TruffleString .create (bytes , offset , length , stride , encoding , codePointLength , codeRange , hashCode , isCacheHead );
189
197
}
190
198
191
199
static TruffleString createConstant (byte [] bytes , int length , int stride , Encoding encoding , int codePointLength , int codeRange ) {
@@ -201,7 +209,7 @@ static TruffleString createConstant(byte[] bytes, int length, int stride, Encodi
201
209
202
210
static TruffleString createLazyLong (long value , Encoding encoding ) {
203
211
int length = NumberConversion .stringLengthLong (value );
204
- return TruffleString .create (new LazyLong (value ), 0 , length , 0 , encoding , length , TSCodeRange .get7Bit (), true );
212
+ return TruffleString .create (new LazyLong (value ), 0 , length , 0 , encoding , length , TSCodeRange .get7Bit (), 0 , true );
205
213
}
206
214
207
215
static TruffleString createLazyConcat (TruffleString a , TruffleString b , Encoding encoding , int length , int stride , int codeRange ) {
@@ -210,12 +218,13 @@ static TruffleString createLazyConcat(TruffleString a, TruffleString b, Encoding
210
218
assert a .isLooselyCompatibleTo (encoding );
211
219
assert b .isLooselyCompatibleTo (encoding );
212
220
assert length == a .length () + b .length ();
213
- return TruffleString .create (new LazyConcat (a , b ), 0 , length , stride , encoding , a .codePointLength () + b .codePointLength (), codeRange , true );
221
+ return TruffleString .create (new LazyConcat (a , b ), 0 , length , stride , encoding , a .codePointLength () + b .codePointLength (), codeRange , 0 , true );
214
222
}
215
223
216
224
static TruffleString createWrapJavaString (String str , int codePointLength , int codeRange ) {
217
225
int stride = TStringUnsafe .getJavaStringStride (str );
218
- return TruffleString .create (str , 0 , str .length (), stride , Encoding .UTF_16 , codePointLength , codeRange , false );
226
+ int hash = TStringUnsafe .getJavaStringHashMasked (str );
227
+ return TruffleString .create (str , 0 , str .length (), stride , Encoding .UTF_16 , codePointLength , codeRange , hash , false );
219
228
}
220
229
221
230
private static boolean attrsAreCorrect (Object dataA , Encoding encoding , int offset , int length , int codePointLength , int codeRange , int stride ) {
@@ -3083,7 +3092,7 @@ final int calculateHash(AbstractTruffleString a, Encoding expectedEncoding,
3083
3092
return h ;
3084
3093
}
3085
3094
3086
- private static int maskZero (int rawHashCode ) {
3095
+ static int maskZero (int rawHashCode ) {
3087
3096
int h = rawHashCode ;
3088
3097
if (h == 0 ) {
3089
3098
h --;
0 commit comments