1
1
/*
2
- * Copyright (c) 2015, 2023 , Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2015, 2024 , Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
@@ -119,91 +119,64 @@ static long mix(long lengthCoder, long value) {
119
119
*/
120
120
static long mix (long lengthCoder , String value ) {
121
121
lengthCoder += value .length ();
122
- if (value .coder () == String . UTF16 ) {
122
+ if (! value .isLatin1 () ) {
123
123
lengthCoder |= UTF16 ;
124
124
}
125
125
return checkOverflow (lengthCoder );
126
126
}
127
127
128
128
/**
129
- * Prepends the stringly representation of boolean value into buffer,
129
+ * Prepends constant and the stringly representation of value into buffer,
130
130
* given the coder and final index. Index is measured in chars, not in bytes!
131
131
*
132
132
* @param indexCoder final char index in the buffer, along with coder packed
133
133
* into higher bits.
134
134
* @param buf buffer to append to
135
135
* @param value boolean value to encode
136
+ * @param prefix a constant to prepend before value
136
137
* @return updated index (coder value retained)
137
138
*/
138
- static long prepend (long indexCoder , byte [] buf , boolean value ) {
139
+ static long prepend (long indexCoder , byte [] buf , boolean value , String prefix ) {
139
140
int index = (int )indexCoder ;
140
141
if (indexCoder < UTF16 ) {
141
142
if (value ) {
142
- buf [--index ] = 'e' ;
143
- buf [--index ] = 'u' ;
144
- buf [--index ] = 'r' ;
145
- buf [--index ] = 't' ;
143
+ index -= 4 ;
144
+ buf [index ] = 't' ;
145
+ buf [index + 1 ] = 'r' ;
146
+ buf [index + 2 ] = 'u' ;
147
+ buf [index + 3 ] = 'e' ;
146
148
} else {
147
- buf [--index ] = 'e' ;
148
- buf [--index ] = 's' ;
149
- buf [--index ] = 'l' ;
150
- buf [--index ] = 'a' ;
151
- buf [--index ] = 'f' ;
149
+ index -= 5 ;
150
+ buf [index ] = 'f' ;
151
+ buf [index + 1 ] = 'a' ;
152
+ buf [index + 2 ] = 'l' ;
153
+ buf [index + 3 ] = 's' ;
154
+ buf [index + 4 ] = 'e' ;
152
155
}
156
+ index -= prefix .length ();
157
+ prefix .getBytes (buf , index , String .LATIN1 );
153
158
return index ;
154
159
} else {
155
160
if (value ) {
156
- StringUTF16 .putChar (buf , --index , 'e' );
157
- StringUTF16 .putChar (buf , --index , 'u' );
158
- StringUTF16 .putChar (buf , --index , 'r' );
159
- StringUTF16 .putChar (buf , --index , 't' );
161
+ index -= 4 ;
162
+ StringUTF16 .putChar (buf , index , 't' );
163
+ StringUTF16 .putChar (buf , index + 1 , 'r' );
164
+ StringUTF16 .putChar (buf , index + 2 , 'u' );
165
+ StringUTF16 .putChar (buf , index + 3 , 'e' );
160
166
} else {
161
- StringUTF16 .putChar (buf , --index , 'e' );
162
- StringUTF16 .putChar (buf , --index , 's' );
163
- StringUTF16 .putChar (buf , --index , 'l' );
164
- StringUTF16 .putChar (buf , --index , 'a' );
165
- StringUTF16 .putChar (buf , --index , 'f' );
167
+ index -= 5 ;
168
+ StringUTF16 .putChar (buf , index , 'f' );
169
+ StringUTF16 .putChar (buf , index + 1 , 'a' );
170
+ StringUTF16 .putChar (buf , index + 2 , 'l' );
171
+ StringUTF16 .putChar (buf , index + 3 , 's' );
172
+ StringUTF16 .putChar (buf , index + 4 , 'e' );
166
173
}
174
+ index -= prefix .length ();
175
+ prefix .getBytes (buf , index , String .UTF16 );
167
176
return index | UTF16 ;
168
177
}
169
178
}
170
179
171
- /**
172
- * Prepends constant and the stringly representation of value into buffer,
173
- * given the coder and final index. Index is measured in chars, not in bytes!
174
- *
175
- * @param indexCoder final char index in the buffer, along with coder packed
176
- * into higher bits.
177
- * @param buf buffer to append to
178
- * @param value boolean value to encode
179
- * @param prefix a constant to prepend before value
180
- * @return updated index (coder value retained)
181
- */
182
- static long prepend (long indexCoder , byte [] buf , boolean value , String prefix ) {
183
- indexCoder = prepend (indexCoder , buf , value );
184
- indexCoder = prepend (indexCoder , buf , prefix );
185
- return indexCoder ;
186
- }
187
-
188
- /**
189
- * Prepends the stringly representation of char value into buffer,
190
- * given the coder and final index. Index is measured in chars, not in bytes!
191
- *
192
- * @param indexCoder final char index in the buffer, along with coder packed
193
- * into higher bits.
194
- * @param buf buffer to append to
195
- * @param value char value to encode
196
- * @return updated index (coder value retained)
197
- */
198
- static long prepend (long indexCoder , byte [] buf , char value ) {
199
- if (indexCoder < UTF16 ) {
200
- buf [(int )(--indexCoder )] = (byte ) (value & 0xFF );
201
- } else {
202
- StringUTF16 .putChar (buf , (int )(--indexCoder ), value );
203
- }
204
- return indexCoder ;
205
- }
206
-
207
180
/**
208
181
* Prepends constant and the stringly representation of value into buffer,
209
182
* given the coder and final index. Index is measured in chars, not in bytes!
@@ -216,26 +189,17 @@ static long prepend(long indexCoder, byte[] buf, char value) {
216
189
* @return updated index (coder value retained)
217
190
*/
218
191
static long prepend (long indexCoder , byte [] buf , char value , String prefix ) {
219
- indexCoder = prepend (indexCoder , buf , value );
220
- indexCoder = prepend (indexCoder , buf , prefix );
221
- return indexCoder ;
222
- }
223
-
224
- /**
225
- * Prepends the stringly representation of integer value into buffer,
226
- * given the coder and final index. Index is measured in chars, not in bytes!
227
- *
228
- * @param indexCoder final char index in the buffer, along with coder packed
229
- * into higher bits.
230
- * @param buf buffer to append to
231
- * @param value integer value to encode
232
- * @return updated index (coder value retained)
233
- */
234
- static long prepend (long indexCoder , byte [] buf , int value ) {
192
+ int index = (int )indexCoder ;
235
193
if (indexCoder < UTF16 ) {
236
- return StringLatin1 .getChars (value , (int )indexCoder , buf );
194
+ buf [--index ] = (byte ) (value & 0xFF );
195
+ index -= prefix .length ();
196
+ prefix .getBytes (buf , index , String .LATIN1 );
197
+ return index ;
237
198
} else {
238
- return StringUTF16 .getChars (value , (int )indexCoder , buf ) | UTF16 ;
199
+ StringUTF16 .putChar (buf , --index , value );
200
+ index -= prefix .length ();
201
+ prefix .getBytes (buf , index , String .UTF16 );
202
+ return index | UTF16 ;
239
203
}
240
204
}
241
205
@@ -251,26 +215,17 @@ static long prepend(long indexCoder, byte[] buf, int value) {
251
215
* @return updated index (coder value retained)
252
216
*/
253
217
static long prepend (long indexCoder , byte [] buf , int value , String prefix ) {
254
- indexCoder = prepend (indexCoder , buf , value );
255
- indexCoder = prepend (indexCoder , buf , prefix );
256
- return indexCoder ;
257
- }
258
-
259
- /**
260
- * Prepends the stringly representation of long value into buffer,
261
- * given the coder and final index. Index is measured in chars, not in bytes!
262
- *
263
- * @param indexCoder final char index in the buffer, along with coder packed
264
- * into higher bits.
265
- * @param buf buffer to append to
266
- * @param value long value to encode
267
- * @return updated index (coder value retained)
268
- */
269
- static long prepend (long indexCoder , byte [] buf , long value ) {
218
+ int index = (int )indexCoder ;
270
219
if (indexCoder < UTF16 ) {
271
- return StringLatin1 .getChars (value , (int )indexCoder , buf );
220
+ index = StringLatin1 .getChars (value , index , buf );
221
+ index -= prefix .length ();
222
+ prefix .getBytes (buf , index , String .LATIN1 );
223
+ return index ;
272
224
} else {
273
- return StringUTF16 .getChars (value , (int )indexCoder , buf ) | UTF16 ;
225
+ index = StringUTF16 .getChars (value , index , buf );
226
+ index -= prefix .length ();
227
+ prefix .getBytes (buf , index , String .UTF16 );
228
+ return index | UTF16 ;
274
229
}
275
230
}
276
231
@@ -286,29 +241,18 @@ static long prepend(long indexCoder, byte[] buf, long value) {
286
241
* @return updated index (coder value retained)
287
242
*/
288
243
static long prepend (long indexCoder , byte [] buf , long value , String prefix ) {
289
- indexCoder = prepend (indexCoder , buf , value );
290
- indexCoder = prepend (indexCoder , buf , prefix );
291
- return indexCoder ;
292
- }
293
-
294
- /**
295
- * Prepends the stringly representation of String value into buffer,
296
- * given the coder and final index. Index is measured in chars, not in bytes!
297
- *
298
- * @param indexCoder final char index in the buffer, along with coder packed
299
- * into higher bits.
300
- * @param buf buffer to append to
301
- * @param value String value to encode
302
- * @return updated index (coder value retained)
303
- */
304
- static long prepend (long indexCoder , byte [] buf , String value ) {
305
- indexCoder -= value .length ();
244
+ int index = (int )indexCoder ;
306
245
if (indexCoder < UTF16 ) {
307
- value .getBytes (buf , (int )indexCoder , String .LATIN1 );
246
+ index = StringLatin1 .getChars (value , index , buf );
247
+ index -= prefix .length ();
248
+ prefix .getBytes (buf , index , String .LATIN1 );
249
+ return index ;
308
250
} else {
309
- value .getBytes (buf , (int )indexCoder , String .UTF16 );
251
+ index = StringUTF16 .getChars (value , index , buf );
252
+ index -= prefix .length ();
253
+ prefix .getBytes (buf , index , String .UTF16 );
254
+ return index | UTF16 ;
310
255
}
311
- return indexCoder ;
312
256
}
313
257
314
258
/**
@@ -323,9 +267,18 @@ static long prepend(long indexCoder, byte[] buf, String value) {
323
267
* @return updated index (coder value retained)
324
268
*/
325
269
static long prepend (long indexCoder , byte [] buf , String value , String prefix ) {
326
- indexCoder = prepend (indexCoder , buf , value );
327
- indexCoder = prepend (indexCoder , buf , prefix );
328
- return indexCoder ;
270
+ int index = ((int )indexCoder ) - value .length ();
271
+ if (indexCoder < UTF16 ) {
272
+ value .getBytes (buf , index , String .LATIN1 );
273
+ index -= prefix .length ();
274
+ prefix .getBytes (buf , index , String .LATIN1 );
275
+ return index ;
276
+ } else {
277
+ value .getBytes (buf , index , String .UTF16 );
278
+ index -= prefix .length ();
279
+ prefix .getBytes (buf , index , String .UTF16 );
280
+ return index | UTF16 ;
281
+ }
329
282
}
330
283
331
284
/**
@@ -375,8 +328,7 @@ static String simpleConcat(Object first, Object second) {
375
328
byte [] buf = newArray (indexCoder );
376
329
// prepend each argument in reverse order, since we prepending
377
330
// from the end of the byte array
378
- indexCoder = prepend (indexCoder , buf , s2 );
379
- indexCoder = prepend (indexCoder , buf , s1 );
331
+ indexCoder = prepend (indexCoder , buf , s2 , s1 );
380
332
return newString (buf , indexCoder );
381
333
}
382
334
@@ -443,8 +395,10 @@ static byte[] newArrayWithSuffix(String suffix, long indexCoder) {
443
395
*/
444
396
@ ForceInline
445
397
static byte [] newArray (long indexCoder ) {
446
- byte coder = (byte )(indexCoder >> 32 );
447
- int index = ((int )indexCoder ) << coder ;
398
+ int index = (int )indexCoder ;
399
+ if (indexCoder >= UTF16 ) {
400
+ index <<= 1 ;
401
+ }
448
402
if (index < 0 ) {
449
403
throw new OutOfMemoryError ("Overflow: String length out of range" );
450
404
}
0 commit comments